题目
思路
总耗时取决于耗时最长的区域,我们只需用资源把最大耗时降到最小,就等同于将最终的开垦天数降到最小。
所以,我们先记录初始时的最大耗时maxtime,然后以maxtime为起点,逐天降低最大耗时,当到某一天剩余资源无法再将当前最大耗时降低一天或者最大耗时已经降低到最少开垦天数时,循环结束。
用数组date[i]来记录从第i天再缩短一天所要的资源数。若对于已经被缩短耗时的区域,要将区域所需资源加到前一天。例如,原本最大耗时为7天,缩短到6天后,原本开垦时长为7天的区域就变为了开垦时长为6天的区域,这时候开垦时长为6天的区域就增加了,所以再降低一天所需的资源数也要增加相应的值。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,k;
int date[maxn];
int main()
{
int t,c,maxtime=0;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
cin>>t>>c;
date[t]+=c;
maxtime=max(maxtime,t);
}
int ans=k;
for(int i=maxtime;i>k;i--)
{
if(m>=date[i])
{
date[i-1]+=date[i];
m-=date[i];
}
else{
ans=i;
break;
}
}
cout<<ans<<endl;
return 0;
}