C/C++ 演算法分析與設計:貪心(整數配對)
阿新 • • 發佈:2018-11-12
題目描述
江鳥想到一個有趣的問題:給你N個正整數,你可以將這N個整數按兩個一組的方式成對劃分,當然其中的元素也可以不和其他元素配對劃分。現在的問題是,讓劃分為一對的元素的乘積與未配對的元素相加求和,並且讓和最大。比如:考慮這個集合{0,1,2,4,5,3},如果我們讓{0,3}、{2,5}分別成一對,那麼得到的和為:1+4+(0*3)+(2*5)=15,當然這不是最大值,如果這樣劃分{4,5}、{2,3}分別一組,我們得到的和為:(4*5)+(2*3)+1+0=27,此時得到的和為最大了。
輸入
第一行輸入一個數case代表下面測試資料的總數。以下每個case由兩行組成:第一行輸入N,代表有N個整數(1<=N<=100)第二行輸入這N個整數。(每個整數都小於100)
輸出
輸出每個case對應的最大和。
樣例輸入
2 6 0 1 2 3 4 5 1 3
樣例輸出
27 3
#include<iostream> #include<algorithm> using namespace std; int main() { int n,m,a[100],i,j,s; scanf("%d",&n); while(n--) { s=0; scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&a[i]); if(m==1) printf("%d\n",a[0]); else if(m%2==0) { sort(a,a+i); for(j=i-1;j>=0;j-=2) if(a[j]==0 || a[j-1]==0) s+=a[j]+a[j-1]; else if(a[j]==1 || a[j-1]==1) s+=a[j]+a[j-1]; else s+=a[j]*a[j-1]; printf("%d\n",s); } else if(m%2==1) { sort(a,a+i); for(j=i-1;j>=1;j-=2) if(a[j]==0 || a[j-1]==0) s+=a[j]+a[j-1]; else if(a[j]==1 || a[j-1]==1) s+=a[j]+a[j-1]; else s+=a[j]*a[j-1]; s+=a[0]; printf("%d\n",s); } } }