zoukankan      html  css  js  c++  java
  • UVA 10201 DP

    Adventures in Moving - Part IV

    题意:

    汽车邮箱容量200升,最初有100升油,要求到达终点油箱中的油不少于100升的最小花费,不能到达终点输出Impossible.

    汽车走1单位距离消耗1升油。

    输入t组数据

    输入n表示要求从起点到距离为n的点

    输入若干个加油站的a,b,表示加油站距离起点的距离和每升油的价格;

    代码:

    //dp[i][j]=min(dp[i][j],dp[i-1][j+dis-k]+k*w),dp[i][j]表示到达
    //i加油站时还剩j升油,dis表示i到i-1的距离,k(0<=k<=j)表示在i
    //加油站买多少油,最后要求dp[m][100+n-id[m]]!=inf.
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int dp[110][210],id[110],w[110];
    char s[110];
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            getchar();
            memset(dp,inf,sizeof(dp));
            dp[0][100]=0;
            int cnt=0;
            while(gets(s)!=NULL&&s[0]!=''){
                cnt++;
                sscanf(s,"%d %d",&id[cnt],&w[cnt]);
                if(id[cnt]>n) cnt--;
            }
            id[0]=0;
            for(int i=1;i<=cnt;i++){
                int dis=id[i]-id[i-1];
                for(int j=0;j<=200;j++){
                    for(int k=0;k<=j;k++)
                        if(j+dis-k<=200)
                        dp[i][j]=min(dp[i][j],dp[i-1][j+dis-k]+k*w[i]);
                }
            }
            if(n-id[cnt]>100||dp[cnt][100+n-id[cnt]]==inf) printf("Impossible
    ");
            else printf("%d
    ",dp[cnt][100+n-id[cnt]]);
            if(t) printf("
    ");
        }
        return 0;
    }
    /*
    1
    500
    100 999
    150 888
    200 777
    300 999
    400 1009
    450 1019
    500 1399
     */
  • 相关阅读:
    初识线段树
    win7下vc6.0打开文件未响应的解决方法
    SQL 2008安装
    20200730 Div.2模拟赛题解
    20190928 Div3模拟赛题解
    Codeforces Round #664 (Div. 2) 题解
    CSP2019回忆录
    [SHOI2014]三叉神经树(加强版)题解
    Linux 下修改Swap区设置
    LoadRunner监控Linux与Windows方法
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6706495.html
Copyright © 2011-2022 走看看