故事的开头总是极尽温柔,故事会一直温柔……💜
✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!
一、🌳代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+50;
ll n,m,k;
int t[N],c[N];
ll cc[N];
int main(){
cin>>n>>m>>k;
int max_t=0,min_t=0;
for(int i=1; i<=n; i++){
cin>>t[i]>>c[i];
cc[t[i]]+=c[i];
max_t=max(max_t,t[i]);
min_t=min(min_t,t[i]);
}
for(int i=max_t; i>=k;i--){
if(m > cc[i]){
if(i==k){
cout<<k<<endl;
break;
}
m-=cc[i];
cc[i-1]+=cc[i];
}else{
cout<<i<<endl;
break;
}
}
return 0;
}
二、🌵解题思路
关键: 总耗时取决于耗时最长的区域,开垦耗时最小为k天
题意转化:如果顿顿剩余的m资源够当前最大的耗时t1的所有的k个田地缩小1个耗时,则m更新,t求解=t,计算更新后的剩余的m时候够当前最大的耗时t1-1
for(int i=1; i<=n; i++){
cin>>t[i]>>c[i];
cc[t[i]]+=c[i];
max_t=max(max_t,t[i]);
min_t=min(min_t,t[i]);
}
其中
cc[t[i]]+=c[i];
cc[i]存放的是开垦时间为i天的土地全缩减耗时一天所需要的资源量。
以上准备后,我们只需:
for(int i=max_t; i>=k;i--){
if(m > cc[i]){
if(i==k){
cout<<k<<endl;
break;
}
m-=cc[i];
cc[i-1]+=cc[i];
}else{
cout<<i<<endl;
break;
}
}
即:
- 全部田地缩减耗时至k时,输出k,并break。
- 剩余的m资源够当前最大的耗时i的所有的k个田地缩小1个耗时,则m更新,并将当前i的所需资源cc[i]加到cc[i-1]。(因为当前耗时i天的,更新后,皆变为所需耗时i-1天)
- 如果剩余的m资源够当前最大的耗时i的所有的k个田地缩小1个耗时,输出i即可。
综上所述,完成求解。
❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!
🌻他回来了,带着光的。
❤️🔥brave、confident、earnest
🌈you can, we can.