cqoj921E整数匹配
这是一个贪心题,把我坑的好惨,忘还原得70.上午被卡得,,
首先给出长度为n的一组数,可以两两配对相乘也可以进行相加,问怎样才可以使总和最大?那么可以显然看出来,当这个数为0或1时,我们要相加。其余进行排序,将a>b>c>d中的ab+cd配对,可以证明这样的贪心策略是正确的。排序后,确定相加部分的长度,如果后面是但单数个,那么会多出一个数来,那么也把他加上即可。写一个while,每一次都cnt-=2,最后即可求出最大值,然而这是多组数据,,,
1.不放过任何证明贪心策略正确性的机会
2.多组数据的话一定要把变量还原,否则会对后面的计算产生影响(对心灵产生影响)
代码
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int t; int n; int ans=0; int a[105];//存数 int book; int main(){ cin>>t; for(int i=1;i<=t;i++){ ans=0; book=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); if(n==1){ cout<<a[1]<<endl; continue; } for(int i=1;i<=n;i++){ if(a[i]==0||a[i]==1){ book=i; } } int cnt=n; if((n-book)%2==1){ book+=1; } for(int i=1;i<=book;i++){ ans+=a[i]; } while(cnt>=book+2){ ans+=a[cnt]*a[cnt-1]; cnt-=2; } cout<<ans<<endl; } return 0; }
待到oi十一月,我花开后百花杀。