J - 玩游戏

小A和小B玩游戏,初始的时候小A给小B一组包含n个数的数组。他们按如下的规则进行:

每次小B得到一组数,他把这组数的和加到自己的分数里面(他的初始分数是0),然后他把这组数还给小A。

如果小A得到的这组数中只包含一个数,他就把这组数丢掉;否则,他就把这两组数分成两个不相交且不为空的两组数传回给小B

上述操作不断执行,直到小A把他所有的数组全都丢弃为止。小B得到的最大分数是多少?    

 

第一行包含一个数n(1<=n<=3*10^5)。第二行包含n个数a1,a2...an(1<=ai<=10^6),表示初始的时候小A给小B的数组。

 

输出一个最大可能的分数并换行。  

 

3

3 1 5

1

10

 

26

10

 

一开始读题,分成‘两个不想交的且不为空的数组‘  不相交是什么意思??    一开始我理解的是两个数组集合中不能有相同元素 比如{1},{1,2}就是不合法的....但出题人毛事不是这意思..

 

这题贪心 即可。

#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 300010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
ll a[maxn];
int main()
{
    freopen("in.txt","r",stdin);
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++)cin>>a[i];
        if(n==1){
            cout<<a[1]<<endl;continue;
        }
        sort(a+1,a+1+n);
        ll ans=0;
        for(int i=1;i<=n;i++){
            ans+=(i+1)*a[i];
        }
        ans-=a[n];
        cout<<ans<<endl;
    }
    return 0;
}

 

posted on 2016-12-06 10:44  Beserious  阅读(641)  评论(0编辑  收藏  举报