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.
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.
Input
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.
Output
Sample Input
2 2 20 25 40 1 8
Sample Output
08:00:40 am 08:00:08 am
啊,想象一下,复仇者联盟4上映的时候影院门口排起了长龙,有的顾客很迅速一会就买好票了,有的就很墨迹要半天。二你作为一个售票员,当然要想一种可以让你自己最快下班的方法啦。顾客可以一个人买票,也可以两个人一起买票。当然每个时间都不一样啦。
用one数组统计每个人自己买要多少时间,用two数组统计和前面的人一起买要多少时间。dp数组表示到这个人为止的最小时间。这样最优解就是对应的dp数组加上one[i]或者two[i]的最小值,由于只要考虑前面两个人,所以只要一个循环就OK啦。
总觉得最长时间会超过四小时到下午,但实际上我没写判断am pm也过了,大概是数据不严格的原因吧。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int one[2010],two[2010],dp[2010];
int main()
{
int n;
cin>>n;
while(n--)
{
int k;
cin>>k;
memset(one,0,sizeof(one));
memset(two,0,sizeof(two));
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++)
scanf("%d",&one[i]);
for(int i=2;i<=k;i++)
scanf("%d",&two[i]);
dp[0]=0;
dp[1]=one[1];
for(int i=2;i<=k;i++)
dp[i]=min(dp[i-1]+one[i],dp[i-2]+two[i]);
int h=dp[k]/3600+8;
int m=dp[k]/60%60;
int s=dp[k]%60;
printf("%02d:%02d:%02d am\n",h,m,s);
}
return 0;
}