方法:优先队列
交换函数
方法一:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<queue>
int a[10100];
using namespace std;
int main ()
{
int n;
while(~scanf("%d",&n))
{
priority_queue<int ,vector<int>,greater<int> >q; //从小到大排列,如从大到小则把greater变为less;
int i,j,t1,t2,t,sum=0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
q.push(a[i]);
}
while(true) //队列内不为空执行;
{
t1=q.top();
q.pop();
t2=q.top();
q.pop();
t=t1+t2;
sum+=t;
if(q.empty()) //队列释放出来后在再次放入队列中前判断队列是否为空,为空则已经执行完程序,只需要直接加入总的数值中;
break;
q.push(t);
}
printf("%d\n",sum);
}
return 0;
}
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int a[10100];
int n;
int main ()
{
while(~scanf("%d",&n))
{
priority_queue<int>q; //从大到小排列;
int t,sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
q.push(-a[i]); //取负放入队列中;
}
while(q.size()-1) //每次放入队列则 只剩一个元素时则结束程序;
{
t=-q.top();
q.pop();
t-=q.top();
q.pop();
sum+=t;
q.push(-t);
}
printf("%d\n",sum);
}
return 0;
}
//每组测试数据时建立队列则 队列不用清空,如队列在主函数外建立,则每次都必须清空队列;
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int a[10100];
int n;
priority_queue<int>q; //从大到小排列;
int main ()
{
while(~scanf("%d",&n))
{
int t,sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
q.push(-a[i]); //取负放入队列中;
}
while(q.size()-1) //每次放入队列则 只剩一个元素时则结束程序;
{
t=-q.top();
q.pop();
t-=q.top();
q.pop();
sum+=t;
q.push(-t);
}
while(!q.empty()) //清空队列;
q.pop();
printf("%d\n",sum);
}
return 0;
方法二:
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10010],n;
void df(int x) //循环找到最小的数值交换;
{
int i,t,q;
q=x;
for(i=q+1;i<=n;i++)
{
if(a[i]<a[q])
q=i;
}
swap(a[x],a[q]);
}
int main()
{
int i,sum;
while(~scanf("%d",&n))
{
sum=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
df(1);
df(2);
for(i=2;i<=n;i++)
{
a[i]+=a[i-1];
sum+=a[i];
df(i); //循环中调用交换函数;
df(i+1);
}
printf("%d\n",sum);
}
return 0;
}