您的位置:首页 > 其它

hdu 1260 Tickets

2012-10-17 22:51 246 查看
题目描述:

Tickets

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

Total Submission(s): 560 Accepted Submission(s): 280



[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]
浙江工业大学第四届大学生程序设计竞赛

[align=left]Recommend[/align]
JGShining

水题一枚,dp[i]表示到第i个人买完票需要的最短时间。

状态转移方程: dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]) a[i]表示单买的时间,b[i]表示i和i-1合买的时间。

附上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>

#define CLR(a,b) memset((a),(b),sizeof((a)))

using namespace std;
int const nMax = 3010;
int const inf=0x7fffffff;

int a[nMax],b[nMax];
int dp[nMax];
int n;

int DP()
{
CLR(dp,0);
dp[1]=a[1];
dp[2]=min(b[2],a[1]+a[2]);
for(int i=3;i<=n;i++){
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
}
return dp
;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=2;i<=n;i++)scanf("%d",&b[i]);
int t=DP();
t+=8*3600;
t%=(24*3600);
if(t/3600<12) printf("%02d:%02d:%02d am\n",t/3600,t%3600/60,t%3600%60);
else {
t-=12*3600;
printf("%02d:%02d:%02d pm\n",t/3600,t%3600/60,t%3600%60);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: