zoukankan      html  css  js  c++  java
  • hdu4422 The Little Girl who Picks Mushrooms

    此题要注意一些细节:

    当n<=3时,ans=1024

    当n=4时,若有三个固定值的和是1024的倍数,ans=1024,否则枚举剩下的两个固定值的和取最佳

    当n=5时,枚举三个固定值看是否为1024的倍数,若有,用剩下2个的和更新答案

    有一个坑点,直接模上1024求ans会出问题,得分0,1024的正数倍,和其他三种情况讨论

    代码有点搓,观看请慎重。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n,a[10];
    int main(){
        while(~scanf("%d",&n)){
            for(int i=0;i<n;i++) scanf("%d",&a[i]);
            sort(a,a+n);
            if(n<=3){cout<<1024<<endl;continue;}
            int sum=0;
            for(int i=0;i<n;i++) sum+=a[i];
            int ans=0;
            if(n==4){
               bool flag=0;
               for(int i=0;i<n&&!flag;i++){
                   for(int j=0;j<n&&!flag;j++){
                        if(i==j) continue;
                        for(int k=0;k<n;k++){
                            if(i==k||j==k) continue;
                            if((a[i]+a[j]+a[k])%1024==0){
                                flag=1;break;
                            }
                        }
                   }
               }
               if(flag) cout<<1024<<endl;
               else if(a[n-1]+a[n-2]<=1024) cout<<a[n-1]+a[n-2]<<endl;
               else{
                   for(int i=0;i<n;i++){
                      for(int j=0;j<n;j++){
                         if(i==j) continue;
                         if(a[i]+a[j]==0) ans=max(ans,0);
                         else if((a[i]+a[j])%1024==0) ans=1024;
                         else ans=max(ans,(a[i]+a[j])%1024);
                      }
                   }
                   cout<<ans<<endl;
               }
               continue;
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                   if(i==j) continue;
                   for(int k=0;k<n;k++){
                      if(i==k||j==k) continue;
                      if((a[i]+a[j]+a[k])%1024==0){
                         int x=sum-a[i]-a[j]-a[k];
                         if(x==0) ans=max(ans,0);
                         else if(x%1024==0) ans=1024;
                         else ans=max(ans,x%1024);
                      }
                   }
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    hdu4422
  • 相关阅读:
    邻接表(网)
    邻接表(无向图)
    邻接表(无向图)
    邻接表(有向图)
    邻接表(有向图)
    邻接表(无向图)
    邻接表(有向图)
    邻接表(有向图)
    邻接表(网)
    完美解决循环线性操作倒计时无报错
  • 原文地址:https://www.cnblogs.com/wonderzy/p/3398275.html
Copyright © 2011-2022 走看看