您的位置:首页 > 其它

HDU-1260 Tickets ( DP )

2016-04-27 22:18 274 查看
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1260

[align=left]Problem Description[/align]
Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this is really a tuff time for Joe who sells the film tickets. He is wandering when could he go back home as early as possible.
A
good approach, reducing the total time of tickets selling, is let
adjacent people buy tickets together. As the restriction of the Ticket
Seller Machine, Joe can sell a single ticket or two adjacent tickets at a
time.
Since you are the great JESUS, you know exactly how much time
needed for every person to buy a single ticket or two tickets for
him/her. Could you so kind to tell poor Joe at what time could he go
back home as early as possible? If so, I guess Joe would full of
appreciation for your help.

[align=left]Input[/align]
There are N(1<=N<=10) different scenarios, each scenario consists of 3 lines:
1) An integer K(1<=K<=2000) representing the total number of people;
2) K integer numbers(0s<=Si<=25s) representing the time consumed to buy a ticket for each person;
3) (K-1) integer numbers(0s<=Di<=50s) representing the time needed for two adjacent people to buy two tickets together.

[align=left]Output[/align]
For
every scenario, please tell Joe at what time could he go back home as
early as possible. Every day Joe started his work at 08:00:00 am. The
format of time is HH:MM:SS am|pm.

[align=left]Sample Input[/align]

2

2

20 25
40

1

8

[align=left]Sample Output[/align]

08:00:40 am
08:00:08 am

DP水题 前i个人所用的时间只与前i-1人和前i-2人所用的时间有关,直接的结果。

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

int one[2005];
int two[2005];
int dp[2005];

int main(){
ios::sync_with_stdio( false );

int T, k;
cin >> T;
while( T-- ){
cin >> k;
for( int i = 0; i < k; i++ )
cin >> one[i];
for( int i = 0; i < k - 1; i++ )
cin >> two[i];

dp[1] = one[0];
dp[2] = min( one[0] + one[1], two[0] );

for( int i = 3; i <= k; i++ )
dp[i] = min( dp[i - 1] + one[i - 1], dp[i - 2] + two[i - 2] );

int h = 8, m = 0, s = 0;
s = dp[k] % 60;
m = dp[k] / 60 % 60;
h += dp[k] / 60 / 60;

if( h < 10 ) cout << "0" << h << ":";
else cout << h << ":";
if( m < 10 ) cout << "0" << m << ":";
else cout << m << ":";
if( s < 10 ) cout << "0" << s << " am\n";
else cout << s << " am\n";
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: