欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

18718 航行

程序员文章站 2022-05-24 09:33:36
...

18718 航行

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: 不限定

Description

银河帝国正走向覆亡。为保留文明的种子,你需要驾驶飞船将一批“颛家”从帝国首都护送至银河边缘的基地。
现在已知航线是一条直线,帝国首都为起点(坐标0),基地为终点(坐标L),在这条航线上有N个空间站可以补充飞船的能源。
第i个空间站的坐标为ai,飞船停靠在第i个空间站必须花费bi个银河币,同时让你的飞船能量恢复为最大值M。
出发前飞船的能量是满额的M,每一点能量都可以让飞船航行一个坐标单位。

现在你已经通过募捐(榨篇)获得了S个银河币,请计算下飞船能否到达基地。

输入格式

第一行输入四个个数字N,L,M,S;(1<=N<=200) (1<=L<=20000) (1<=M<=20000) (0<=S<=20000)
接下来N行,每行输入两个数字,ai,bi (0<=ai<=L) (0<=bi<=20000)

输出格式

仅一行,如果能到达基地,输出Yes,否则输出No

输入样例

1 10000 5000 20000
5000 20000

输出样例

Yes

提示

样例说明,飞船可以花费5000能量到达一号空间站,花光20000银河币补满能量后,再行驶5000到达基地。
程序设计和数据结构设计都要考虑边缘数据。例如本题目,可能存在无需补给就直接行驶到基地的情况,也能存在bi>s的情况。

#include<iostream>
#include<cstdio>
using namespace std;
#include<queue>
int main(void) {
    int N, L, M, S;
    //N个空间站
    //L:基地终点
    //M:初始能量值
    //S:银河币
    cin >> N >> L >> M >> S;
    //能量站位置
    int position[205];
    //能量站恢复能量需要的银河币
    int cost[205];
    //当前能量
    int power = M;
    //当前位置
    int cur = 0;
    //输入能量站位置
    for (int i = 1; i <= N; i++) {
        cin >> position[i];
        cin >> cost[i];
    }
    //这里一定要先设置 起点0的位置
    position[0]=0;
    cost[0] = 0;
    //定义当前 三个队列
    queue<int>pos, money, pow;
    //一定要让起点位置进队
    pos.push(0);
    money.push(S);
    pow.push(M);
    //定义一个flag
    int flag = 0;
    int curpos, curmoney, curpow;

    while (1) {
        //如果队空  退出
        if (pos.empty()) {
            break;
        }
        //判定
        curmoney = money.front();
        curpos = pos.front();
        curpow = pow.front();

        //如果能量大于等于 终点-能量站 说明能到达  退出
        if (L - position[curpos] <= curpow) {
            flag = 1; break;
        }

        //当站数N>到达的k站数的时候
        if (curpos < N) {
            //    如果能够购买                能量M大于离下一个能量站的距离
            if (curmoney >= cost[curpos] && M >= position[curpos + 1] - position[curpos]) {
                //入队减少后的钱
                money.push(curmoney - cost[curpos]);
                //入队下一个能量站位置
                pos.push(curpos + 1);
                //能量回满到M然后减去到达下一个能量站需要的能量
                pow.push(M - (position[curpos + 1] - position[curpos]));
            }

            //    如果不购买 且现有能量能够到达下一个站
            if (curpow >= position[curpos + 1] - position[curpos]) {
                //入队未消耗的钱
                money.push(curmoney);
                //入队下一个站
                pos.push(curpos + 1);
                //下一次的能量为 当前能量-距离
                pow.push(curpow - (position[curpos + 1] - position[curpos]));
            }
        }

        //如果到了最后一个站  这里要特殊判断
        if (curpos == N) {
            //            如果能够购买 并且  能量M大于最后的距离
            if (curmoney >= cost[curpos] && M >= L - position[curpos]) {
                flag = 1;
                break;
            }
            //     当前能量走得到终点
            if (curpow >= L - position[curpos]) {
                flag = 1;
                break;
            }
        }

        money.pop();
        pos.pop();
        pow.pop();
    }
    if (flag == 1)cout << "Yes"; else cout << "No";
    return 0;
}
相关标签: 广度搜索