标签:
题意:一共有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; }
HDU 4422 The Little Girl who Picks Mushrooms
标签:
原文地址:http://www.cnblogs.com/Apro/p/4704414.html