您的位置:首页 > 其它

hdu1260 Tickets(DP)

2016-05-28 14:25 330 查看
题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1260



Tickets

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 2897 Accepted Submission(s): 1413



[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


[align=left]Source[/align]
浙江工业大学第四届大学生程序设计竞赛

题意:求售票员把票卖给K个人所需的最短时间,票有2种方式售卖,一种是单独卖给一个顾客,另一种就是卖给相邻的两个顾客(_(:з」∠)_看到这里就觉得是dp了)

解题思路:首先,票有2种方式售卖,就猜想有2个转移方程。这时我们先设dp[i]为卖给前i个人(包含第i个人)的最短时间,很明显有2种状态可以转移到这个状态上。

①第i个人单独购买票。即dp[i-1] + s[i] ; (s[i]为第i个人单独购票所需的时间)

②第i和i-1一起买票。 即dp[i-2] +d[i-1] ;(d[i]第i和第i-1一起买票所需的时间)

所以我们就可以很简单得出方程 dp[i] = min { dp[i-1] + s[i] , dp[i -2] +d[i-1]}

AC代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 2050;
const int INF = 1e+9;
int d[maxn];
int s[maxn];
int dp[maxn];
char str[][10]={"pm","am"};
int main()
{
int n;
cin >> n ;
while(n--)
{
int k1 ;
scanf("%d",&k1);
for(int i = 1 ; i <= k1 ; i ++)
scanf("%d",&s[i]);
int k2 = k1-1;
for(int i = 1 ; i <= k2 ; i ++)
scanf("%d",&d[i]);
dp[0] = 0;
for(int i = 1; i <= k1; i ++)
dp[i] = INF;
for(int i = 1 ; i <= k1; i ++)
{
dp[i] = min(dp[i],dp[i-1]+s[i]);
if(i>=2)
dp[i] =min(dp[i],dp[i-2]+d[i-1]);
}
int cnt1 = dp[k1]/3600;
int cnt2 = (dp[k1]-cnt1*3600)/60;
int cnt3 = dp[k1]%60;
int HH,MM,SS,flag=1;
HH = 8+cnt1 ;
MM = cnt2;
SS = cnt3;
if(HH>=12)
{
HH-=12;
flag = 0;
}
printf("%02d:%02d:%02d %s\n",HH,MM,SS,str[flag]);
}

return 0 ;
}


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