您的位置:首页 > 其它

HDU Tickets(简单的dp递推)

2014-08-03 18:23 471 查看

Tickets

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 972 Accepted Submission(s): 495


[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]
浙江工业大学第四届大学生程序设计竞赛
一开始状态方程考虑的非常复杂 一直在想着如何利用前一个状态推下一个状态,所以开始我的一个状态里有三种情况,然后这种复杂的情况有点驾驭不了,没想到直接可以用前两种状态对当前状态。悲剧

#include<iostream>
using namespace std;
int a[2001],b[2001],dp[2001];
#define min(x,y) (x)<(y)? (x):(y)
int n;
void pre()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=2;i<=n;i++) cin>>b[i];
}
void solve()
{
int i,j;
dp[0]=0;dp[1]=a[1];
for(i=2;i<=n;i++)
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
int num=dp
;
int h,m,s;
h=num/60/60;num-=h*60*60;
m=num/60;num-=m*60;
s=num;
printf("%02d:%02d:%02d",h+8>12? h+8-12:h+8,m,s);
printf(" %s\n",h+8>12? "pm":"am");
}
int main(void)
{
int t,i,j;
while(cin>>t){
while(t--){
pre();
solve();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: