CSP认证 202303-2 垦田计划 优化之后的方法 100分题解
看了博客里大佬的做法,可以考虑到不用每次都去遍历那个时间所需资源数的数组或者列表,因为每次想要让整体时间缩短,就考虑所需天数最大的,当天数最大的不唯一时,比如样例中,开始需要6天的就有两个,所以想要让整体工期从6天到5天,就需要把所有6天的资源都给足才可以,代码里用到了cost数组,cost[i]表示所有需要i天才能完成的任务,想要缩短,所需要的资源总数(所有的都加起来)
#include<iostream>
using namespace std;
const int N = 100010;
int cost[N] = {0}; //cost[i]表示的是还需要i天完成的所有任务都想缩短需要的资源数
int main(){
long long m,n,k,maxday = 0;
cin >> n >> m >> k;
for(int i = 0; i < n; i++){
int dayNum,c;
cin >> dayNum >> c;
cost[dayNum] += c;
if(dayNum > maxday){ //用maxday记录当前最长的时间
maxday = dayNum;
}
}
while((maxday > k) && (m >= cost[maxday])){
//两种情况下不能继续调整,第一个是已经达到了要求的最短开垦时间,第二个是当前剩余资源已经不够再减一天了
int maxCost = cost[maxday];
m -= maxCost; //调整剩余资源数
maxday--;
cost[maxday] += maxCost;
}
cout << maxday;
return 0;
}