XTUOJ-1262-fish

  1. 题目

题目描述
小明很喜欢钓鱼,现在有n个池塘可以钓鱼,第i个池塘首次内能钓到ai条鱼。 第i个池塘如果被钓过k次,那么每次下一次能钓到的鱼的数目为max{0,ai−k×bi}。 现在小明能钓m次鱼,请问他最多能钓到多少条鱼?
输入
第一行是一个整数T(1≤T≤100),表示样例的个数。
每个样例的第一行是n(1≤n≤1000),m(1≤m≤100000);
以后的n行,每行是ai(1≤ai≤10000),bi(0≤bi≤10000)。
输出
每行输出一个样例的结果。
样例输入
2
3 5
3 1
4 2
1 0
2 5
2 1
1 1
样例输出
12
4
样例解释
第一个样例,在第1个池塘钓3次,第2个池塘钓2次,3+2+1+4+2 = 12;
第二个样例,在第1个池塘钓2次,第2个池塘钓1次,2+1+1 = 4。

  1. 解法:每次吊能吊最多的鱼塘即可获得最多鱼,因此我们可以维护一个优先队列(优先队列可以自动排序,而且效率很高)。代码如下。
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
typedef struct node {
	int a, b;
	bool operator < (const node & n) const {
		return a < n.a;
	}
} Node;
priority_queue<node> q;
int main(int argc, char const **argv) {
	int T, m, n;
	Node node;
	int sum = 0;
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d", &n, &m);
		while(n--) {
			scanf("%d%d", &node.a, &node.b);
			q.push(node);
		}
		while(!q.empty()) {
			node = q.top();
			q.pop();
			if(node.b == 0) {
				sum += node.a * m;
				break; 
			} else if(node.a == 0) {
				break;
			} else {
				sum += node.a;
				node.a = max(0, node.a-node.b);
				q.push(node);
				m--;
			}
			if(!m) {
				break;
			}
		}
		printf("%d\n", sum);
		sum = 0;
		while(!q.empty()) {
			q.pop();
		}
	}
    return 0;
} 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值