HDU 4422 The Little Girl who Picks Mushrooms
题意:在幻想乡的一天,爱丽丝准备去五座山上去采蘑菇,她从每座山上采的蘑菇量为0<=wi<=2012克。她带了五个袋子,每到一座山,她就用一个袋子来装蘑菇,每个袋子最多盛2012克蘑菇。爱丽丝想尽可能多地带蘑菇回家做美味的蘑菇汤。不过爱丽丝居住的魔法森林有三个妖精——桑尼、露娜和斯塔,爱丽丝必须给她们三袋子蘑菇作为过路费,这些蘑菇总量必须为整数千克,否则爱丽丝必须留下所有蘑菇,空手着回家(这三个妖精什么时候这么厉害了(lll¬ω¬))。不过幻想乡的数量换算不太一样,1千克=1024克。这还没完,普通的魔法使魔理沙总是会偷爱丽丝采回来的蘑菇,如果爱丽丝剩下的蘑菇超过1千克,魔理沙就会1千克1千克地不断偷走爱丽丝的蘑菇。求爱丽丝最多带多少蘑菇回家。
输入格式:
多组输入,每组第一行一个整数n(0<=n<=5),表示已知的n个袋子的蘑菇数量。接下来n个数,表示每个袋子里的蘑菇数。
输出格式:
一个整数,表示爱丽丝最多带回的蘑菇数。
Sample Input
1
9
4
512 512 512 512
5
100 200 300 400 500
5
208 308 508 708 1108
Sample Output
1024
1024
0
792
对于第四组样例,给桑尼、露娜和斯塔:(208+308+508)=1024,
被魔理沙偷走后,剩余(708+1108)-1024=792。
题解:
可能很多人没明白输入,爱丽丝一共有5个袋子,我们只知道其中n个袋子中的蘑菇数,其余的袋子有可能为任意数,我们算答案按最大可能做就行。
对于n<=3,我们肯定可以用三个袋子凑出给三妖精的,然后两个袋子再凑个1024。
对于n=4,如果其中有三个袋子可以凑成1024的整数倍,那剩余的那个已知袋子可以和未知袋子凑个1024。如果没有,只能用两个已知的加一个未知的去凑1024的整数倍,将剩余两个之和最大的袋子带回家。
对于n=5,所有袋子里的蘑菇数都知道,我们先找能凑成1024整数倍的三个袋子,在此前提下找剩余两个袋子之和最大的。如果没有可以凑成1024整数倍的袋子,输出0。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int sum=0;
int ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(n<=3)
{
ans=1024;
}
if(n==4)
{
for(int i=1;i<=n;i++)
{
if((sum-a[i])%1024==0)
{
ans=1024;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
int now=a[i]+a[j];
if(now!=0&&now%1024==0)
{
now=1024;
}
if(now>1024)
{
now%=1024;
}
ans=max(ans,now);
}
}
}
}
if(n==5)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
int now=a[i]+a[j];
if((sum-now)%1024==0)
{
if(now!=0&&now%1024==0)
{
now=1024;
}
if(now>1024)
{
now%=1024;
}
ans=max(ans,now);
}
}
}
}
}
printf("%d\n",ans);
}
return 0;
}