uva 10201 Adventures in Moving - Part IV

来源:互联网 发布:无敌9号 知乎 编辑:程序博客网 时间:2024/05/16 05:33

题意:有t组测试数据,每组数据的开始表示终点的位置,然后接下来有若干对数x,y,x表示沿途的加油的位置,y表示每升油的价格。每组数据间有一个空行。开始的时候在位置0,油箱里有100升汽油,问最后到达终点,且油箱里还有100升汽油所需的最小花费是多少。

在做这题时候,有两个误区,WA了很多次,一是错认为终点一定在加油站上,二是认为给我们的加油站的位置不会超过终点。但实际上是会超过的,也就是说我们判断这组测试数据结束只能通过最后的那个空行。


#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define INF 1<<30const int N=305;int n,m,map[N][N*2];bool vis[N][N*2];struct node{    int x,y;    void fun(int a,int b){x=a;y=b;}}gas[N];int dp(int,int);int main(){    //freopen("in.txt","r",stdin);    int t,t_cnt=0;    scanf("%d",&t);    while(t--)    {        n=1;        memset(map,0,sizeof(map));        memset(vis,0,sizeof(vis));        memset(gas,0,sizeof(gas));        char str[100];        scanf("%d",&m);        getchar();        while(gets(str))        {            if(strlen(str)) {sscanf(str,"%d%d",&gas[n].x,&gas[n].y);n++;}            else break;        }        int temp=dp(0,100);        if(t_cnt++!=0) puts("");        if(temp!=INF) printf("%d\n",dp(0,100));        else puts("Impossible");    }    return 0;}int dp(int x,int y){    bool &flag=vis[x][y];    int &res=map[x][y];    if(flag) return res;    else if(m-gas[x].x<=y-100)    {        flag=1;res=0;        return res;    }    else    {        res=INF;        for(int i=x+1;i<n;i++)        {            int remain=y-(gas[i].x-gas[x].x);            if(remain>=0)            {                for(int j=0;j+remain<=200;j++)                {                    int temp=dp(i,j+remain);                    if(temp!=INF) res=min(res,temp+j*gas[i].y);                }            }            else break;        }        flag=1;return res;    }}


原创粉丝点击