小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 << ;
const double eps=1e-;
using namespace std;
ll a[maxn];
int main()
{
freopen("in.txt","r",stdin);
int n;
while(cin>>n){
for(int i=;i<=n;i++)cin>>a[i];
if(n==){
cout<<a[]<<endl;continue;
}
sort(a+,a++n);
ll ans=;
for(int i=;i<=n;i++){
ans+=(i+)*a[i];
}
ans-=a[n];
cout<<ans<<endl;
}
return ;
}
05-26 05:43