cqoj921E整数匹配
Posted china-mjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于cqoj921E整数匹配的主要内容,如果未能解决你的问题,请参考以下文章