08:00:08 am
题意:一个人卖票,他可以同时卖给两个人票,也可以只卖给一个人票。给你他卖给一个人票的时间和卖给相连两个人票的时间,他八点上班,问什么时候下班。
思路:用dp做。判断min(dp[i-1]+a[i],dp[i-2]+b[i-1]) 就好了 a[i]是单独卖花费时间 b[i]是两个一起卖花费时间。这两个一个是 单独买第i个,一个是两个一起买。因为不管dp[i-2]是单独买的还是和上一个一起买的都不影响下两个一起买,dp[i-1]也不会影响下一个单独买。知道最后一个。输出比较麻烦,首先根据秒数算出小时 分钟 。在判断时间是否超过了十二点,超过了最后是pm。其次就是输出0的问题了,分开讨论,如果该时刻(时针,分针,秒针)大于时直接输出这个时间,如果小于线输出0在输出时间。就是这个道理了。写的时候我在想给的数据会不会到第二天,就是时间会不会超过24小时。但根据常理来说一天上下班不可能到第二天,所以就不用考虑到第二天的情况了!
代码:
#include
using namespace std;
int a[10010];
int b[10010];
int dp[10010];
int main()
{
int t,k=1;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++)
scanf("%d",&b[i]);
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
}
int h,f,m;
h=dp[n]/3600;
f=(dp[n]-3600*h)/60;
m=(dp[n]-3600*h-60*f);
h+=8;
if(h>12)
{
printf("%d:",h);
if(f>=10)
printf("%d:",f);
else
printf("0%d:",f);
if(m>=10)
printf("%d pm\n",m);
else
printf("0%d pm\n",m);
}
else
{
if(h>=10)
printf("%d:",h);
else
printf("0%d:",h);
if(f>=10)
printf("%d:",f);
else
printf("0%d:",f);
if(m>=10)
printf("%d am\n",m);
else
printf("0%d am\n",m);
}
}
return 0;
}