1. 程式人生 > >codevs1063 合併果子 貪心

codevs1063 合併果子 貪心

#include<cstdio>
#include<algorithm>
using namespace std;
long long a[10005];
int main()
{
    int n,i,t;
    long long ans,p;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    ans=0;
    for(i=1; i<n; i++)
    {
        a[i+1]=a[i]+a[i+1];
        a[i]=0;
        t=i+1;
        ans+=a[i+1];
        while(t<n&&a[t]>a[t+1])
        {
            p=a[t];
            a[t]=a[t+1];
            a[t+1]=p;
            t++;
        }
    }
    printf("%lld",ans);
    return 0;
}
//這個更好 
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int main(){
	int n,t;
	priority_queue<int,vector<int>,greater<int> > Q;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>t;
		Q.push(t);
	}
	int ans=0;
	while(Q.size()>1){
		int a,b;
		a=Q.top();
		Q.pop();
		b=Q.top();
		Q.pop();
		ans+=a+b;
		Q.push(a+b);
	}
	cout<<ans<<endl;
	return 0;
}