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; }
原文地址:http://www.cnblogs.com/pk28/
与有肝胆人共事,从无字句处读书。
欢迎关注公众号:
欢迎关注公众号: