【手把手刷CCF】202303-2-垦田计划100分(超简单思路,含详细解释注释与代码)

故事的开头总是极尽温柔,故事会一直温柔……💜

✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

一、🌳代码如下:

#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;
		}
	}

即:

  1. 全部田地缩减耗时至k时,输出k,并break。
  2. 剩余的m资源够当前最大的耗时i的所有的k个田地缩小1个耗时,则m更新,并将当前i的所需资源cc[i]加到cc[i-1]。(因为当前耗时i天的,更新后,皆变为所需耗时i-1天)
  3. 如果剩余的m资源够当前最大的耗时i的所有的k个田地缩小1个耗时,输出i即可。

综上所述,完成求解。

❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

🌻他回来了,带着光的。
❤️‍🔥brave、confident、earnest
🌈you can, we can.

在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪&

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值