CCF-CSP垦田计划20230302

链接首页 - 计算机软件能力认证考试系统

70分的代码就是按照题意,循环找t中最大的数,每运行一次:当c[i] > m时进行天数-1,直到最大的天数的c[i] < m了才退出。

100分的代码则是新建一个数组,将天数作为下标,天数相等的资源相加,然后对天数数组进行由大到小的遍历,每循环一次检查一次m是否大于改数组的资源总数,大于则m-数组[天数],更新天数-1的数组,小于则保存结果退出。

注意事项:数组作为全局变量时会自动赋初值,所以新建的数组要写成全局变量。

#include <iostream>
#include <algorithm>

using namespace std;
int all[100005];
int main()
{
	long n, m, k;
	cin >> n >> m >> k;
	
	int t[n+1], c[n+1];
	
	t[0] = 0; 	//保存最大的天数
	c[0] = 0; 	//初始化 
	for(int i = 1; i <= n; i++){
		cin >> t[i] >> c[i];
		all[t[i]] += c[i];
		if(t[0] < t[i]){
			t[0] = t[i];
		}
	}
	
	int res = 0;
	for(int i = t[0]; i >= k; i--){
		if(m < all[i]) break;
		m -= all[i];
		all[i-1] += all[i];	//实际意义上的max天数均-1
		res = i-1;
	}
	cout << res;
	
	return 0;
}

这个很妙的一点在于题目所求的为最大的,当最大的减少之后又会出现最大的,所以直接将天数作为下标,资源作为数据进行保存!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值