http://ac.jobdu.com/problem.php?pid=1107 搬水果
方法一:(优先队列)
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#include<stdio.h>
int main(void)
{
int i,n,m,a,b,sum;
//使用优先队列
priority_queue<int,vector<int>,greater<int> >q; //从小到大排序
while(scanf("%d",&n),n)
{
while(!q.empty())
q.pop();
for(i=0;i<n;i++)
{
scanf("%d",&m);
q.push(m);
}
sum=0;
while(q.size()>2)
{
a=q.top();
q.pop();
b=q.top();
q.pop();
a+=b;
sum+=a;
q.push(a);
}
if(q.size()==2)
{
a=q.top();
q.pop();
b=q.top();
q.pop();
sum=sum+a+b;
printf("%d\n",sum);
}
else if(q.size()==1)
{
printf("%d\n",q.top());
q.pop();
}
}
return 0;
}
方法二:
//multiset,默认是升序排列的
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
multiset<int> s; //可以在multiset容器中放入相同的元素
inline bool scan_d(int &num) // 这个就是 加速的 关键了
{
char in;bool IsN=false;
in=getchar();
if(in==EOF)
return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-') { IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9')
{
num*=10,num+=in-'0';
}
if(IsN)
num=-num;
return true;
}
int main(void)
{
int i,n,sum,x,a;
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
s.clear();
sum = 0;
for(i = 0 ; i < n ; ++i)
{
scan_d(x);
s.insert(x);
}
if(s.size() == 1)
sum += (*s.begin());
while(s.size()>1)
{
a = (*s.begin());
s.erase(s.begin());
a += (*s.begin());
s.erase(s.begin());
sum += a;
if(!s.empty())
s.insert(a);
}
printf("%d\n",sum);
}
return 0;
}