1. 程式人生 > >合並遊戲

合並遊戲

return sizeof ems 100% pan left cin ext 遊戲

合並遊戲

merge.cpp/c/pas

(1s/256M)

題目描述

Cindy和Dan在玩一個遊戲。

一開始Cindy想出了N個數,接著她把這N個數全部給了Dan。

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

~\(≧▽≦)/~啦啦啦思路:

要所求值最大,就先按降序排個序,然後一次加起來就是最大,如果是在兩個或以下個數中選擇就特判一下。

(v)~ 代碼:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int n,a[1001],b[1001],ans,num,tot,q;
 8 
 9 int cmp(int a,int b){
10     return
a>b; 11 } 12 13 int main(){ 14 15 memset(a,-1,sizeof(a)); 16 int head=1,tail=head+2; 17 cin>>n; 18 19 for(int i=1;i<=n;i++){ 20 cin>>a[i]; 21 }sort(a+1,a+n+1,cmp); 22 23 do{ 24 for(int i=head;i<=tail;i++) { 25 num+=a[i]; 26 a[i]=-1; 27 }a[tail]=num; 28 ans+=a[tail]; 29 head+=tail-1; 30 tail=head+2; 31 for(int i=1;i<=n;i++) 32 if(a[i]!=-1) tot++; 33 } while(tot>=3); 34 35 for(int i=1;i<=n;i++) 36 if(a[i]!=-1) tot++; 37 38 if(tot<3){ 39 for(int i=1;i<=n;i++) 40 if(a[i]!=-1) q=i; 41 ans+=a[q]+a[q+1]; 42 } 43 44 cout<<ans<<endl; 45 return 0; 46 }

合並遊戲