HDU 4422 The Little Girl who Picks Mushrooms

题意:一共有5座山,已知小女孩在n座山采了n篮蘑菇,如果n小于5则在其他的山里采了任意重量的蘑菇,给出每篮蘑菇的重量,她回去的时候会遇到仨女巫要她交出三篮蘑菇的重量和恰好为1024的倍数,否则就把她的蘑菇都拿走,然后会遇到一个魔法师,只要小女孩剩的蘑菇数大于1024她就偷走1024,直到不大于1024为止,问小女孩最多能带回去多少蘑菇。

 

解法:当n小于等于3的时候,只要用一半没给出的蘑菇重量和给出的凑1024倍数给女巫,用剩下的一半再凑1024的倍数让魔法师偷,就可以拿到最大值1024,当n等于4的时候讨论两种情况:1.用给出的4篮可以凑出1024的倍数给女巫,那么用没给出的和剩下的一篮再凑1024的倍数,可以拿到最大值1024。2.如果凑不出就只能用没给出的凑,所以在那4个里挑两个被偷完能剩最大的。当n等于5时,看能不能用3个凑1024倍数,能就选剩下两个的和偷完最大不能就是0。【总之就是很麻烦……

 

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long

using namespace std;

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        if(n <= 3)
        {
            while(n--)
            {
                int a;
                scanf("%d", &a);
            }
            puts("1024");
        }
        else if(n == 4)
        {
            int a[4];
            for(int i = 0; i < 4; i++)
                scanf("%d", &a[i]);
            int maxn = 0;
            for(int i = 0; i < 4; i++)
                for(int j = i + 1; j < 4; j++)
                    for(int k = j + 1; k < 4; k++)
                        if((a[i] + a[j] + a[k]) % 1024 == 0)
                            maxn = 1024;
            if(maxn == 0)
                for(int i = 0; i < 4; i++)
                    for(int j = i + 1; j < 4; j++)
                        maxn = max(maxn, (a[i] + a[j] - 1) % 1024 + 1);
            printf("%d\n", maxn);
        }
        else
        {
            int a[5];
            int sum = 0;
            for(int i = 0; i < 5; i++)
            {
                scanf("%d", &a[i]);
                sum += a[i];
            }
            int maxn = 0;
            for(int i = 0; i < 5; i++)
                for(int j = i + 1; j < 5; j++)
                    for(int k = j + 1; k < 5; k++)
                    {
                        if((a[i] + a[j] + a[k]) % 1024 == 0)
                            maxn = max(maxn, (sum - a[i] - a[j] - a[k] - 1) % 1024 + 1);
                    }
            printf("%d\n", maxn);
        }
    }
    return 0;
}

  

posted @ 2015-08-05 12:45  露儿大人  阅读(229)  评论(0编辑  收藏  举报