YACS|2023年5月月赛|丙组 T3 滑雪训练

T3 滑雪训练https://www.iai.sh.cn/problem/791

题目描述

小爱最近迷上了滑雪,某滑雪场有 n 条不同难度的雪道,只有学习并滑了第 i 条雪道,才能去参加第 i+1条雪道的学习与训练。

已知,第一次滑第 i 条雪道时,需要先进行 ai 分钟的学习,再花 bi ​分钟滑该雪道一次,才算学习完成。若之后再滑第 i 条雪道,则仅需 bi 分钟即可滑一次。

小爱共有 T 分钟时间,请问如何安排才能使他能滑的圈数最多?

输入格式

输入第一行,两个正整数 n,T
接下来 n 行:每行两个正整数 ai,bi ​表示第i条雪道需要的学习时间和滑雪时间。

输出格式

输出一个正整数,表示小爱最多可以滑的圈数。

数据范围

  • 对于30%的数据,1≤n≤10
  • 对于60%的数据,1≤n≤10^3
  • 对于100%的数据,1≤n≤10^5,1≤ai,bi,T≤10^18

样例数据

输入:

3 100 10 20 5 5 20 10

输出:

14

说明:

先花30分钟学习第一滑道,此时共计滑了一圈 在花10分钟学习第二滑道,此时共计滑了两圈 剩余60分钟,滑第二滑道,共计滑了14圈

思路:

贪心策略。

*    因为有训练时间,所以无必要不换赛道
*    因此,若要换赛道,必定是后面有时间b[i]更短的赛道
*    一旦到达某个b[i]较小的赛道,就应该在该赛道花完所有时间,
*    或 继续向后探索,若继续向后,则当前赛道必不作停留,尽可能把时间留给后面
*    所以,目标是终点赛道,枚举,终点赛道之前的赛道就只是路过一次。
*

#include <bits/stdc++.h>
using namespace std;
long long a[100005];
long long b[100005];
long long n, t, sumt=0;
long long ans=0;
int main () {
	cin>>n>>t;
	for(int i=1; i<=n; i++){
		cin>>a[i]>>b[i];
	}
	for(int i=1; i<=n; i++){
		if(t >= a[i]+b[i]){
			t -= a[i]+b[i]; 
			ans = max(ans, i+t/b[i]);//止步当前赛道
			//无需考试 t除以b[i]的余数,必定是不能用在前面的赛道的,
			//否则也没必要走到当前赛道了 
		}
		else{
			break; 
		} 
	}
	cout<<ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值