题意:有N个球,M个瓶子,每个球有分数,每个瓶子有容球上限和容分数上限,这里的容分数上线是其中的每个球都不达到这个上限就行。问最多能容纳多少个球,这些球加起来分数多少。
思路:贪心,分数高的球往分数上限高的瓶子里面扔即可。
#include <cstdio>
#include <algorithm>
using namespace std;
struct Bottle {
int c, q;
} b[205];
bool cmp1(Bottle a, Bottle b) {
if (a.q != b.q) return a.q > b.q;
return a.c > b.c;
}
bool cmp2(int a, int b) {
return a > b;
}
int p[205];
int n, m, i, j;
int ansN, ansP;
int main() {
while (scanf("%d%d",&n,&m) != EOF) {
for (i = 0; i < n; ++ i) scanf("%d",&p[i]);
for (i = 0; i < m; ++ i) scanf("%d%d",&b[i].c,&b[i].q);
sort(p, p+n, cmp2);
sort(b, b+m, cmp1);
ansN = ansP = 0;
j = 0;
for (i = 0; i < n; ++ i) {
while (b[j].c == 0) {
j ++;
if (j >= m) {
i = n;
break;
}
}
if (p[i] <= b[j].q) {
b[j].c --;
ansN ++;
ansP += p[i];
}
}
printf("%d %d\n", ansN, ansP);
}
}