UVa 10201 Adventures in Moving - Part IV

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 10201 Adventures in Moving - Part IV相关的知识,希望对你有一定的参考价值。

 

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”。

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

 1 #include<iostream> 
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<string>
 5 using namespace std;
 6 
 7 const int INF = 100000000;
 8 
 9 char s[100];
10 int length;
11 int num;
12 int a[105], b[105];
13 int d[105][205];      //d[i][j]表示在第i站还剩j汽油时的最少费用
14 
15 int main()
16 {
17     //freopen("D:\\txt.txt", "r", stdin);
18     int T;
19     gets(s);
20     sscanf(s, "%d", &T);
21     gets(s);     //吃掉空行
22     while (T--)
23     {
24         gets(s);
25         sscanf(s, "%d", &length);
26         num = 0;
27         a[0] = 0;
28         while (gets(s) != NULL)
29         {
30             if (s[0] == \0)     break;
31             sscanf(s, "%d%d", &a[++num], &b[num]);
32             //cout << a[num] << " " << b[num] << endl;
33             if (a[num] > length)  num--;     //距离大于目的地的站不用考虑
34         }
35 
36         for (int i = 0; i <= num;i++)
37         for (int j = 0; j <= 200; j++)
38             d[i][j] = INF;
39         d[0][100] = 0;   //起点,油量为200,花费为0
40 
41         for (int i = 1; i <= num; i++)
42         {
43             int l = a[i] - a[i - 1];    //距离
44             for (int j = 0; j <= 200; j++)   //加了k升油后此时的油量
45             {
46                 for (int k = 0; k <= j;k++)    //所加的油量
47                 if (j + l - k <= 200)
48                     d[i][j] = min(d[i][j], d[i - 1][j + l - k] + k*b[i]);
49             }
50         }
51         if (length - a[num]>100 || d[num][100 + length - a[num]] == INF)
52             printf("Impossible\n");
53         else
54             printf("%d\n", d[num][100 + length - a[num]]);
55         if (T)    printf("\n");
56     }
57     return 0;
58 }

 

以上是关于UVa 10201 Adventures in Moving - Part IV的主要内容,如果未能解决你的问题,请参考以下文章

Adventures in Functions

英语作文 我们这一模块学习了'ALICE'S ADVENTURES IN WONDERLAND'的开头,但是后来发生的

「UVA 12161」Ironman Race in Treeland

「UVA 12161」Ironman Race in Treeland

Boxes in a Line UVA - 12657 (双向链表)

UVA11090 Going in Cycle!!