洛谷p1090__合并果子
合并果子可以作为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;
}
嗯,收获颇多。

浙公网安备 33010602011771号