HDU 4422 The Little Girl who Picks Mushrooms

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值