zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    bzoj2957 -- 线段树
    bzoj2209 [ JSOI2011 ] -- splay
    bzoj3874 [ AHOI2014 ] -- 爬山算法
    bzoj1038 [ ZJOI2008 ] -- 模拟退火+二分
    bzoj2428 [ HAOI2006 ] -- 模拟退火
    bzoj3680 -- 模拟退火
    bzoj4500 -- 差分约束
    bzoj3527 -- FFT
    bzoj1013 [ JSOI2008 ] -- 高斯消元
    使用nginx try_files 指令 管理静态资源
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11564339.html
Copyright © 2011-2022 走看看