18718 航行

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的情况。

思路

题意:从起点到终点,起始资金S,起始能量M,全程L,每走一个坐标花费一个能量,在每一个坐标处停靠花费ai元,充电至M。

首先会存在一种特殊的情况,就是初始能量足够走完全程,故这个可以先挑出来考虑,一定可以到达终点。

其余情况用dfs来考虑,在每一个坐标点都可以先考虑特殊情况,此时的能量如果足够到达终点,同样可以直接得出结论。

一般情况下就是每一个坐标点都要考虑,就是只有两种情况,停不停,如果此时的钱足够支付且能量能够到达下一个地点,则充满电继续往前,到下一个坐标点,直到到达终点。

对于为什么每一个点都要停下来充电,是因为,每一个站点所需要的能量是一样的,在哪充电都是可以的。而且在函数中也对特殊情况进行了判断,一旦不充电就可以到达终点,就直接返回,不再进入递归。

#include<stdio.h>
struct node
{
    int a;
    int b;
}choose[250];
int flag;
int N,L,M,S;
void dfs(int m,int e,int n)
{
    if(e+n>=L)
    {
        flag=1;
        return ;
    }
    int i;
    for(i=1;i<=N;i++)
    {
        if(m>=choose[i].b&&e>=choose[i].a-n)
        {
            dfs(m-choose[i].b,M,choose[i].a);
        }
    }
}

int main()
{
    scanf("%d %d %d %d",&N,&L,&M,&S);
    int i;
    for(i=1;i<=N;i++)
        scanf("%d %d",&choose[i].a,&choose[i].b);
    if(M>=L)
        flag=1;
    dfs(S,M,0);
    if(!flag)
        printf("No");
    else
        printf("Yes");
    return 0;
}

		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值