二、越野比赛
1. 审题
题目描述
最近赛车手 K a l n Kaln Kaln 加入了心心念念的 F a r Far Far 车队,马上就迎来了自己的首秀,参加一场直线加速赛:已知 F a r Far Far 车队会提供 n n n 种类型的赛车, K a l n Kaln Kaln 只能选择其中一辆完成比赛,不能中途换车,第 i i i 辆车踩一次油门所产生的油耗为 a i a_i ai,能够行驶的距离为 b i b_i bi。现给出车队现在拥有的总油量 p p p,以及车队提供的车的种数 n n n,和赛道总距离 m m m,请你设计一个小程序,帮助 K a l n Kaln Kaln 选择合适的赛车,如果有多辆,按输入顺序输出,若没有合适的车,输出 − 1 -1 −1。
注意: K a l n Kaln Kaln 可以在剩余油量足够的情况下,无限次踩油门。
输入格式
第一行有三个整数,分别表示 p , n , m p,n,m p,n,m。
后面 n n n 行,每行两个整数,第 ( i + 1 ) (i+1) (i+1) 行的整数表示第i辆车踩一次油门所产生的油耗为 a i a_i ai,能够行驶的距离为 b i b_i bi。
输出格式
输出仅一行,即可以完成比赛的车辆序号,车辆序号即为输入的第几辆车,如果有多个,按输入顺序输出,每两个序号之间使用空格隔开,若没有合适的车,输出 − 1 -1 −1。
输入样例1
100 3 5000
90 0
20 1000
110 10000
输出样例 1
2
输入样例 2
10 3 5000
20 1000
90 0
110 10000
输出样例 2
-1
提示
对于全部的测试点 1 ≤ p , n , m ≤ 30000 1 \le p,n,m \le 30000 1≤p,n,m≤30000, 0 ≤ a i , b i ≤ 1 × 1 0 5 0 \le ai,bi \le 1 \times 10^5 0≤ai,bi≤1×105。
2. 思路
为了更加直观,我们可以这么命名变量:
int oil; // 总油量
int kind; // 提供车的种类
int S; // 赛道总距离int ri; // 耗油量
int si; // 能够行驶的距离bool flag = true; // 用于标记是否有合适的车辆
接着我们可以找到几个特殊的例子,比如:
- 油耗为 0 0 0 且能行驶的距离不为 0 0 0
- 能行驶的距离为 0 0 0
- 油耗超过总油量
否则,我们才会进行模拟。
int nowS = 0;int nowOil = oil;while (nowOil >= ri){nowS += si;nowOil -= ri;}if (nowS >= S){cout << i << " ";flag = false;continue;}
3. 参考答案
#include <iostream>
using namespace std;int oil; // 总油量
int kind; // 提供车的种类
int S; // 赛道总距离int ri; // 耗油量
int si; // 能够行驶的距离bool flag = true; // 用于标记是否有合适的车辆int main()
{// 输入数据cin >> oil >> kind >> S;for (int i = 1; i <= kind; i++){cin >> ri >> si;// 特殊情况if (ri == 0 && si != 0) // 油耗为0且能行驶的距离不为0{cout << i << " ";flag = false;continue;}if (si == 0) // 能行驶的距离为0{continue;}if (ri > oil) // 油耗超过总油量{continue;}// 模拟int nowS = 0;int nowOil = oil;while (nowOil >= ri){nowS += si;nowOil -= ri;}if (nowS >= S){cout << i << " ";flag = false;continue;}}// 如果没有合适的车辆if (flag){cout << -1;}return 0;
}