每天一道英文题,ICPC不自闭(26)

Codeforces Round #767 (Div. 2) - A

题目翻译

你知道你可以下载更多的内存吗?有一家商店提供不同的软件,可以增加你的内存。第 i 个RAM增加软件需要 ai GB的内存来运行(暂时,一旦程序运行完毕,您就可以恢复RAM),并提供额外的 bi GB内存(永久)。每个软件只能使用一次。你的电脑目前有 k GB的内存。

请注意,如果需要使用比当前更多GB的RAM,则不能使用增加RAM的软件。

由于RAM是世界上最重要的东西,你想知道,最大可能达到的RAM量是多少?

输入

输入的第一行包含一个整数 t(1≤t≤100)-测试用例的数量。测试用例的描述如下。

每个测试用例的第一行包含整数 n 和 k(1≤n≤100, 1≤k≤1000). 接下来是两行,每行包含描述 n 个数组a和b(1≤ai,bi≤1000)。

输出

对于每个测试用例,输出一行,其中包含可以实现的最大RAM量。

样例

输入

4
3 10
20 30 10
9 100 10
5 1
1 1 5 1 1
1 1 1 1 1
5 1
2 2 2 2 2
100 100 100 100 100
5 8
128 64 32 16 8
128 64 32 16 8

输出

29
6
1
256

解题思路

贪心大法好啊。因为想让RAM的数量尽可能的大,所以排序,将 ai 小的先放前面,如果 ai 相同就把 bi 大的放前面。什么?你们我怎么证明?很简单,如果你知道你能放下他但是你不放,那你可能以后也就没机会放了,也就是有可能本来能放3个结果被某1个RAM占了,那就得不偿失了。

代码示例

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int t;
int n,k;

struct RAM{
	int a;
	int b;
}r[1010];

bool cmp(const RAM &x,const RAM &y){
	if(x.a==y.a) return x.b>y.b;
	else return x.a<y.a;
}

int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;
		for(int i=1;i<=n;i++) cin>>r[i].a;
		for(int i=1;i<=n;i++) cin>>r[i].b;
		sort(r+1,r+1+n,cmp);
		int ans=0;
		for(int i=1;i<=n;i++){
			if(k-r[i].a<0) break;
			k+=r[i].b;
		}
		cout<<k<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值