C++知识点总结(22):模拟算法真题 ★★★★☆《越野比赛》

展示了用C++编写的程序,解决赛车手选择赛车的问题,考虑了油耗、行驶距离、油量限制和比赛全程,输出合适的赛车编号或-1作为无解标志。
摘要由CSDN通过智能技术生成

二、越野比赛

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 1p,n,m30000 0 ≤ a i , b i ≤ 1 × 1 0 5 0 \le ai,bi \le 1 \times 10^5 0ai,bi1×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;
}
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值