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