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