XTU online judge 1262 Fish

Description
小明很喜欢钓鱼,现在有n 个池塘可以钓鱼,第i 个池塘首次内能钓到a i 条鱼。 第i 个池塘如果被钓过k 次,那么每次下一次能钓到的鱼的数目为max{0,a i −k×b i } 。 现在小明能钓m 次鱼,请问他最多能钓到多少条鱼?

Input
第一行是一个整数T(1≤T≤100) ,表示样例的个数。
每个样例的第一行是n(1≤n≤1000),m(1≤m≤100000) ;
以后的n行,每行是a i (1≤a i ≤10000),b i (0≤b i ≤10000) 。

Output
每行输出一个样例的结果。

Sample Input
2
3 5
3 1
4 2
1 0
2 5
2 1
1 1

Sample Output
12
4

样例解释
第一个样例,在第1个池塘钓3次,第2个池塘钓2次,3+2+1+4+2 = 12;
第二个样例,在第1个池塘钓2次,第2个池塘钓1次,2+1+1 = 4。

解题思路:
定义池塘结构体数组ponds[1001],先用sort函数按所有池塘的初始f(可钓鱼数量)降序排序,因为sort函数默认为升序排序,所以要自定义cmp将sort函数变为降序排序。
再定义sorts函数,其作用是在钓完一次ponds[0]的鱼,ponds[0].f改变之后,将所有池塘的f(可钓鱼数量)再次排序。
每次都是ponds[0]被选择以及改变,所以被选择后只需要在排好序列中添加此更改的数据,然后再次用sorts排序即可。

#include<bits/stdc++.h>
using namespace std;

struct pond{
	int a;//参数ai
    int b;//参数bi
    int f;//某次钓鱼数量
    int k;//钓的次数
}ponds[1001];

bool cmp(const pond &pond1, const pond &pond2)
{
    return pond1.f>pond2.f;
}

int sorts(int n)
{
	for(int i = 1; i < n; i++)
	{
		if(ponds[i-1].f < ponds[i].f)
			swap(ponds[i-1],ponds[i]);
		else
			break;
	}
	return 0;
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n,m;
		cin>>n>>m;
		for(int i = 0; i < n; i++)
			cin>>ponds[i].a>>ponds[i].b;
		for(int i = 0; i < n; i++)
		{
			ponds[i].f=ponds[i].a;
			ponds[i].k=0;
		}
		sort(ponds,ponds+n,cmp);
		//降序排序
        //每次都是ponds[0]被选择以及改变,所以被选择后只需要在排好序列中添加此更改的数据
        int fish = 0;
        for(int i = 0; i < m; i++)
        {
        	fish += ponds[0].f;
        	ponds[0].k++;
        	ponds[0].f=max(0,ponds[0].a-ponds[0].k*ponds[0].b);
        	sorts(n);
        	if(ponds[0].f == 0)
        		break;
        }
        cout<<fish<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值