The 2012 ACM-ICPC Asia Changchun Regional Contest-C
题目大意就是 5个数要求三个数和为1024,使得(其他两个数的和-1)%1024+1最大。
当n<=3时,答案显然是1024. n==4 先看有无三个数的和是1024的倍数,没有的话,只能靠第5个数构造,然后枚举期中两个数的和 ,取最大答案。
如果n=5 就是直接枚举答案了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int a[10];
int n,ans;
int max(int a,int b){return (a<b?b:a);}
int main()
{
while (cin>>n){
int sum=0;
for (int i=0;i<n;++i) scanf("%d",&a[i]),sum+=a[i];
if (n<=3) cout<<1024<<endl; else
{
if (n==4){
ans=0;
for (int i=0;i<n;++i)
for (int j=i+1;j<n;++j)
for (int k=j+1;k<n;++k)
if ((a[i]+a[j]+a[k])%1024==0)
ans=1024;
for (int i=0;i<n;++i)
for (int j=i+1;j<n;++j)
ans=max(ans,(sum-a[i]-a[j]-1)%1024+1);
} else
{
ans=0;
for (int i=0;i<n;++i)
for (int j=i+1;j<n;++j)
for (int k=j+1;k<n;++k)
if ((a[i]+a[j]+a[k])%1024==0)
ans=max(ans,(sum-a[i]-a[j]-a[k]-1)%1024+1);
}
cout<< ans << endl;
}
}
return 0;
}