POJ 2465 Adventures in Moving - Part IV

来源:互联网 发布:mac桌面便签软件 编辑:程序博客网 时间:2024/05/22 12:31

大意不再赘述。

思路:d[i][j]表示到达第i个加油站时剩余油量为j时的最小消耗,其他类似UVA 10201.

#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 110; const int INF = 0x3f3f3f3f;struct{int dis, price;}A[MAXN];int n;int de;int d[110][210];void init(){n = 1;for(int i = 0; i < 110; i++)for(int j = 0; j < 210; j++)d[i][j] = INF;d[0][100] = 0;}int dp(){for(int i = 1; i <= n; i++){for(int j = 0; j <= 200; j++){if(j + A[i].dis - A[i-1].dis <= 200){int &st = d[i-1][j + A[i].dis - A[i-1].dis];for(int k = 0; j+k <= 200; k++){d[i][j+k] = min(d[i][j+k], st+k*A[i].price);}}}}int ans = INF;for(int i = 100; i <= 200; i++){if(i >= (100 + de - A[n].dis) && d[n][i] < ans) ans = d[n][i];}return ans;}void read_case(){char str[110];while(gets(str)){if(str[0] == '\0') break;sscanf(str, "%d%d", &A[n].dis, &A[n].price);if(A[n].dis <= de) n++;}--n;}void solve(){init();read_case();int ans = dp();if(ans != INF) printf("%d\n", ans);else printf("Impossible\n");}int main(){while(~scanf("%d%*c", &de)){solve();}return 0;}


原创粉丝点击