uva_10201 adventure_in_moving dp

//uva_10201 adventure_in_moving 
//输入:
//1
//
//500
//100 999
//150 888
//200 777
//300 999
//400 1009
//450 1019
//500 1399
//
//
//1 为输入数据的次数 和500之间有空格 500为路径的长度
//接下来7行 每行有2个数字  第一个数字表示加油站的位置 第二个数表示加油站加一升油的钱
//输出:
//450550
//
//为450550最小的花费
//题目大意:
//车从0开始到输入的结束位置(上次输入为500)开始时车上有100L汽油 1L汽油可以行使1公里
//车最多一次可以装200L汽油 可以在输入的加油站位置加油 则从0位置行使到终点位置时车上还至少有
//100L汽油 则至少需要多少钱
//解题思路 :
//动态规划  用dp[i][j]表示 在第i个加油站 车上还留有jL的汽油最少需要的钱 
//          d[i]表示第i个加油站的位置 p[i]表示第i个加油站的价格
//          则在第i个加油站有两种情况
//          不在第i个加油站加油 dp[i][j]=dp[i-1][j+d[i]-d[i-1]];(0<=j+d[i]-d[i-1]<=200)
//          在第i个加油站加油kL(0=<K<=j) dp[i][j]=dp[i-1][j-k+d[i]-d[i-1]]+k*p[i]; (j-k+d[i]-d[i-1])
//          则状态转换方程为 dp[i][j]=min{dp[i-1][j+d[i]-d[i-1]],dp[i-1][j-k+d[i]-d[i-1]]+k*p[i]}(0<=k<=j)
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
const int STATIONMAX=110;
const int GASMAX=210;

int main(int argc,char *argv[])
{
    int times,length,dp[STATIONMAX][GASMAX],d[STATIONMAX],p[STATIONMAX],stationnum;
    int INF=(1<<30);
    string line;
    cin>>times;
    while(times--)
    {
        stationnum=1;
        cin>>length;
        cin.ignore(1000,'\n');
        while(getline(cin,line)&&(line.length()>0))
        {
            istringstream iss(line);
            iss>>d[stationnum]>>p[stationnum];
            stationnum++;
        }
        stationnum--;
        for(int i=0;i<=stationnum;i++)
            for(int j=0;j<=200;j++)
                dp[i][j]=INF;
        d[0]=0;//0号站台的位置为0位置
        dp[0][100]=0;
        for(int i=1;i<=stationnum;i++)
            for(int j=0;j<=200;j++)
            {
                int dist=d[i]-d[i-1];
                if(j+dist>=0&&j+dist<=200)
                dp[i][j]=dp[i-1][j+dist];
                for(int k=0;k<=j;k++)
                {
                    if(j+dist-k>=0&&j+dist-k<=200)
                    {
                        if(dp[i][j]>(dp[i-1][j+dist-k]+k*p[i]))
                            dp[i][j]=dp[i-1][j+dist-k]+k*p[i];
                    }
                }
            }
        if(length-d[stationnum]+100>200||dp[stationnum][length-d[stationnum]+100]==INF)
            cout<<"Impossible"<<endl;
        else cout<<dp[stationnum][length-d[stationnum]+100]<<endl;
        if(times)
            cout<<endl;
    }

}

在做这道题的时候发现自己不怎么细心 因为题目要求每两个答案之间是要有一个空行的 而且最后一个答案不能有空行 否则就会判错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hebastast

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值