hdu 1494 跑跑卡丁车(动态规划)

Problem Description

跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣。这款游戏的特别之处是你可以通过漂移来获得一种
加速卡,用这种加速卡可以在有限的时间里提高你的速度。为了使问题简单化,我们假设一个赛道分为L段,并且给你通过每段赛道的普通耗时Ai和用加速卡的耗时Bi。加速卡的获得机制是:普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O).能量集满后获得一个加速卡(同时能量清0).加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。一个加速卡只能维持一段赛道,游戏开始时没有加速卡。

问题是,跑完n圈最少用时为多少?

Input

每组输入数据有3行,第一行有2个整数L(0<L<100),N(0<N<100)分别表示一圈赛道分为L段和有N圈赛道,接下来两行分别有L个整数Ai和Bi
(Ai > Bi).

Output

对于每组输入数据,输出一个整数表示最少的用时.

Sample Input

18 1
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 8 8

Sample Output

145

Hint

Hint

对于sample这组数据,你可以先在普通情况下行驶前14段,这时你有2个加速卡以及80%的能量(N2O).在第15和16段用掉2个加速卡,通过第 17段赛道后又可以得到一个加速卡,在第18段赛道使用.

题意:

输入L, N,表示有L段和N圈赛道,每通过1段赛道获得20%的能量,能量到达100%获得一张加速卡(同时能量清0),加速卡最多储存2个,,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。求跑完N圈的最小用时,题目中给出每段赛道的普通用时,和利用加速卡的用时。

思路:

动态规划问题,本题有15个状态,

即无加速卡能量0%,无加速卡能量20%,无加速卡能量40%,无加速卡能量60%,无加速卡能量80%。

1张加速卡能量0%,1张加速卡能量20%,1张加速卡能量40%,1张加速卡能量60%,1张加速卡能量80%。

2张加速卡能量0%,2张加速卡能量20%,2张加速卡能量40%,2张加速卡能量60%,2张加速卡能量80%

分别记为0-14

dp[i][j],表示在第i段赛道第j个状态时的最小用时。a[i]表示通过第i个赛道的普通用时,b[i]表示通过第i个赛道的加速用时。

可以写出状态转移方程

如果不是初始状态,那么j = 0的时候,刚刚用了加速卡
dp[i][j] = dp[i-1][5] + b[i]

j > 10时:不可能在之前的一段赛道获得加速卡,因为j最大只有14

dp[i][j] = dp[i-1][j-1]+a[i]

j = 10时:可能j=14的时候-5了,或者j = 9的时候获得了第二张加速卡

dp[i][j] = Min(dp[i-1][9]+a[i], dp[i-1][14]+a[i])

j<10时:可能是前面没有用加速卡,或者是前面用了加速卡。

dp[i][j] = Min(dp[i-1][j-1]+a[i], dp[i-1][j+5]+b[i])

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 using namespace std;
 7 #define maxn 10010
 8 #define INF 99999999
 9 int dp[maxn][15];
10 int L, N, a[maxn], b[maxn], ans;
11 int Min(int a, int b){
12     return (a<b?a:b);
13 }
14 int main(){
15     while(~scanf("%d%d", &L, &N)){
16         for(int i = 1; i <= L; i++) scanf("%d", &a[i]);
17         for(int i = 1; i <= L; i++) scanf("%d", &b[i]);
18         for(int i = L+1; i <= L*N; i++){
19             a[i] = a[i-L]; b[i] = b[i-L];
20         }
21         memset(dp, 0, sizeof(dp));
22         for(int i = 1; i <= 14; i++) dp[0][i] = INF;
23
24         for(int i = 1; i <= L*N; i++){
25             for(int j = 0; j <= 14; j++){
26                 if(j == 0) dp[i][j] = dp[i-1][5] + b[i];
27                 else if(j < 10) dp[i][j] = Min(dp[i-1][j-1]+a[i], dp[i-1][j+5] + b[i]);
28                 else if(j == 10) dp[i][j] = Min(dp[i-1][9]+a[i], dp[i-1][14]+a[i]);
29                 else if(j > 10) dp[i][j] = dp[i-1][j-1]+a[i];
30             }
31         }
32         ans = INF;
33         for(int i = 0; i <= 14; i++){
34             if(ans > dp[N*L][i]) ans = dp[N*L][i];
35         }
36         printf("%d\n", ans);
37
38     }
39     return 0;
40 }

hdu 1494 跑跑卡丁车(动态规划),布布扣,bubuko.com

时间: 2024-08-25 13:16:25

hdu 1494 跑跑卡丁车(动态规划)的相关文章

HDU ACM 1494 跑跑卡丁车动态规划

分析:L段,N圈,则总共可表示为L*N段,用增加20%的能量表示一个状态,则可表示20%,40%,%60...,共15个,注意第15个时要清零到两个能量卡:用dp[i][j]表示在第i段能量为j的已用时的最少时间.则可得到方程1.不用能量卡时dp[i][j]=min(dp[i][j],dp[i-1][j-1]+a[i-1]:用能量卡时dp[i][j-5]=min(dp[i][j-5],dp[i-1][j]+b[i-1]). #include<iostream> using namespace

hdu 1494 跑跑卡丁车 dp

跑跑卡丁车 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2514    Accepted Submission(s): 875 Problem Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高

Hdu 1494 跑跑卡丁车

题目链接 中文题,题意一目了然 L段路,N圈 那么可以视为L*N段路  跑一圈所用最快时间. 每个加速卡由100能量得到,每跑一段路得到20的能量,最多获得2张加速卡以及80能量. 可以简化成 1表示20能量,则5表示一张加速卡,10表示两张,14表示2张加速卡以及80能量,当为15时则成了两张加速卡以及0能量 设dp[i][j]为在第i段路,能量为j时所用最快时间,则状态转移方程则为: dp[i+1][10]  = min(dp[i][j] + a[i], dp[i+1][10]) , j+1

!HDU 1494 跑跑卡丁车-dp-

题意:一圈赛道分成L段,每段有两种情况,以普通速度则获得20%能量,用加速卡则速度加速:加速卡需要100%的能量来换取.加速卡最多收集两张.求跑完m圈的最短时间. 分析: dp问题还是状态搞不定.跟RP那道结合起来看吧.RP是一维,这题是二维,但是确定状态的出发点是相似的. 引用一段网友的话,加深理解:"因为赛道分为L段,所以很容易想到让DP的第一维用来表示当前在第几段赛道.因为加速卡要100%能量才会获得一张,而每走一段赛道又会获得20%的能量,所以我们可以吧能量槽也分成段,具有5段能量槽就可

hdu 2583 permutation 动态规划

Problem Description Permutation plays a very important role in Combinatorics. For example ,1 2 3 4  5 and 1 3 5 4 2 are both 5-permutations. As everyone's known, the number of n-permutations is n!. According to their magnitude relatives ,if we insert

hdu 3853 LOOPS 动态规划

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 迷宫类的动态规划 首先要作个数学推导 假设留在原地.右移.下移的概率分别是a, b, c 用dp[i][j]表示在第i行第j格能走出去的期望步数 则有: dp[i][j] = a * (dp[i][j] + 1) + b * (dp[i][j+1] + 1) + c * (dp[i+1][j] + 1) 整理一下可得: dp[i][j] = 1/(1-a) * (a +  b * (dp[i]

hdu1494 跑跑卡丁车(动态规划)

Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高你的速度.为了使问题简单化,我们假设一个赛道分为L段,并且给你通过每段赛道的普通耗时Ai和用加速卡的耗时Bi.加速卡的获得机制是:普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O).能量集满后获得一个加速卡(同时能量清0).加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量

HDU 5481 Desiderium 动态规划

Desiderium Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5481 Description There is a set of intervals, the size of this set is n. If we select a subset of this set with equal probability, how many the expected

[HDU 1114] Piggy-Bank (动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 简单完全背包,不多说. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <cmath> 5 #include <map> 6 #include <iterator> 7 #include <vector> 8 using