合并果子可以作为mulitset的板子题
mulitset的 ac code
#include<iostream> #include<set> using namespace std; multiset<int,less<int>> m; int main() { int n; cin>>n; for(int i=0;i<n;i++) { int t; cin>>t; m.insert(t); } long long sum=0; for(int i=0;i<n-1;i++) { int a,b; a=*m.begin(); m.erase( m.begin() ); b=*m.begin(); sum+=a;sum+=b; m.erase( m.begin() ); m.insert(a+b); } cout<<sum; system("pause"); return 0; }
除了这种方法,好鱼还提供了另一种解法:利用两个队列来搞定
#include<iostream> #include<set> #include<queue> #include<algorithm> using namespace std; int arr[10005]; queue<int> m,p; int main() { int n; cin>>n; int sum=0; //temp的作用是模拟副队列进行比较 for(int i=0;i<n;i++)cin>>arr[i]; sort(arr,arr+n); //将输入的元素排列,下一步放入主队列 for(int i=0;i<n;i++)m.push(arr[i]); //此时得到一个有序队列,作为主队列 int a,b; for(int i=0;i<n-1;i++) { if(p.size() && m.size()) { a=min(m.front(),p.front()); if(m.front()<p.front())m.pop(); else p.pop(); } else if(m.size()) { a=m.front();m.pop(); } else { a=p.front();p.pop(); } if(p.size() && m.size()) { b=min(m.front(),p.front()); if(m.front()<p.front())m.pop(); else p.pop(); } else if(m.size()) { b=m.front();m.pop(); } else { b=p.front();p.pop(); } sum+=(a+b); p.push(a+b); //p队列里面的元素一定是有序的,显然 } cout<<sum; system("pause"); return 0; }
嗯,收获颇多。
标签:__,arr,洛谷,果子,int,队列,p1090,include From: https://www.cnblogs.com/bosssz/p/17834760.html