soj 1890. Balls Again

本文探讨了一种使用贪心算法解决球瓶匹配问题的方法,旨在找到最多容纳球数及总分数的最优策略。通过排序与比较,实现高效匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值