您的位置:首页 > 其它

UVa 10201 Adventures in Moving - Part IV

2017-02-05 14:48 267 查看
https://vjudge.net/problem/UVA-10201

题意:

给出到达终点的距离和每个加油站的距离和油费,初始油箱里有100升油,计算到达终点时油箱内剩100升油所需的最少花费。

思路:

我们用d[i][j]来表示车子在第 i 个加油站时还剩 j 升油量的最小花费

先说一下转移方程吧,d[i][j] = min(d[i][j], d[i - 1][j + l - k] + k*b[i]),k代表的是在 i 这个加油站所加的油量,加了之后的总油量就是 j 。

需要注意的是,油箱的容量只有200升,所以j+l-k(第 i-1 个加油站的油量)必须小于等于200

最后的判断,如果目的地距离最后那个加油站大于了100,那最终肯定是没办法剩100升的,这时可以直接“Impossible”。

本题的输入也是很麻烦,每次都需要整行读入才行。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;

const int INF = 100000000;

char s[100];
int length;
int num;
int a[105], b[105];
int d[105][205];      //d[i][j]表示在第i站还剩j汽油时的最少费用

int main()
{
int T;
gets(s);
sscanf(s, "%d", &T);
gets(s);     //吃掉空行
while (T--)
{
gets(s);
sscanf(s, "%d", &length);
num = 0;
a[0] = 0;
while (gets(s))
{
if (s[0] == '\0')     break;
num++;
sscanf(s, "%d %d", &a[num], &b[num]);
//cout << a[num] << " " << b[num] << endl;
if (a[num] > length)  num--;     //距离大于目的地的站不用考虑
}

for (int i = 0; i <= num; i++)
for (int j = 0; j <= 200; j++)
d[i][j] = INF;
d[0][100] = 0;

for (int i = 1; i <= num; i++)
{
int l = a[i] - a[i - 1];
for (int j = 0; j <= 200; j++)
{
for (int k = 0; k <= j; k++)
if (j + l - k <= 200)
d[i][j] = min(d[i][j], d[i - 1][j + l - k] + k*b[i]);
}
}
if (length - a[num]>100 || d[num][100 + length - a[num]] == INF)
printf("Impossible\n");
else
printf("%d\n", d[num][100 + length - a[num]]);
if (T)    printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: