1. 程式人生 > >C/C++ 演算法分析與設計:貪心(整數配對)

C/C++ 演算法分析與設計:貪心(整數配對)

題目描述

江鳥想到一個有趣的問題:給你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);
		}
	}
}