17.2.28清北 合并游戏
合并游戏
merge.cpp/c/pas
(1s/256M)
题目描述
Cindy和Dan在玩一个游戏。
一开始Cindy想出了N个数,接着她把这N个数全部给了Dan。
l Dan得到这组数后,它会挑出3个数(如果不足3个则全部挑出)。Dan会把这几个数加起来变成一个数,然后再把这个数与剩下的数再放到一起。Dan会一直这样做,直到最后只剩下一个数。
Cindy则会在旁边记下每次Dan得到的数,她把这些数加起来,作为本次游戏的得分。她想知道,对于一组数,Dan能得到的最大的得分是多少?
输入格式
第一行一个正整数N,代表这组数的个数;
第二行N个正整数,代表这N个整数。
输出格式
一行一个整数,代表可能的最大得分。
样例输入(merge.in)
4
3 1 5 6
样例输出(merge.out)
29
样例解释
Dan可以首先把(3,5,6)这三个数先合并起来,得到3 + 5 + 6 = 14; 接着他把剩下的两个数再合起来,得到1 + 14 = 15.这样,总得分是最大的 14 + 15 = 29.
数据范围与限制
对于50%的数据,N<=10
对于100%的数据,N<=1000,所有数不大于1000
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 #include<cmath> 7 #include<cstdlib> 8 using namespace std; 9 const int N=1001; 10 int a[N]; 11 bool cmp(int a,int b) 12 { 13 return a>b; 14 } 15 int main() 16 { 17 int ans=0; 18 int n; 19 cin>>n; 20 for(int i=1;i<=n;i++) 21 { 22 cin>>a[i]; 23 } 24 sort(a+1,a+n+1,cmp); 25 for(int i=1;i<=n;i+=2) 26 { 27 if(i<n-1) 28 { 29 a[i+2]+=a[i+1]+a[i]; 30 ans+=a[i+2]; 31 } 32 else{ 33 a[n]+=a[n-1]; 34 ans+=a[n]; 35 } 36 } 37 cout<<ans; 38 }