此题要注意一些细节:
当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; }