中文题,根据题意做就好,判断条件比较多,改 bug 要很久而且容易糊。学长说中文题一定要做出来,结果是最后 AC 的,中文题真的没比英文题好做,一把心酸泪。
提供一个样例:
INPUT |
---|
5 |
9999 1 23 8 |
9998 1 1 23 8 |
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int level[4];
int EXP[10000];
int cmp(const void*a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int N;
while(scanf("%d", &N) != EOF) {
memset(EXP, 0, sizeof(EXP));
for (int i = 0; i < 4; i++)
scanf("%d", &level[i]);
for (int i = 0; i < N; i++)
scanf("%d", &EXP[i]);
if (N < 4) { printf("NO\n"); continue;}
qsort(EXP, N, sizeof(int), cmp);
int cnt = 0;
for (int i = 0; i < 4; i++) {
int tag, exp = 0;
for (tag = 0; tag < N; tag++)
if (EXP[tag] != 0) break;
if (tag == N) break;
for (int j = 0; j < N; j++) {
if (exp + EXP[j] >= level[i]) {
exp += EXP[j];
EXP[j] = 0;
}
else if (j == N - 1) {
while (EXP[j] == 0) j--;
exp += EXP[j];
EXP[j] = 0;
j = -1;
}
if (exp >= level[i]) { cnt++; break;}
for (tag = 0; tag < N; tag++)
if (EXP[tag] != 0) break;
if (tag == N) break;
}
}
if (cnt == 4) {
int sum = 0;
for (int i = 0; i < N; i++) {
sum += EXP[i];
}
printf("YES %d\n", sum);
}
else printf("NO\n");
}
return 0;
}