大概意思是有一个售票员 想早些回家,所以他卖票的时候可以一次卖一个人的,也可以一次卖连续两个人的票,所花费的时间不同。现在给出所有要买票看电影的人买票花费时间以及连续两人买票花费的时间,求售票员最早下班的时间。
dp[i]代表卖完第i个人的票所花费的最小时间,可以得出dp[i]=min(dp[i-1]+dan[i],dp[i-2]+he[i-1]),dan[i]代表第i个人单独购买的时间,he[i]代表第i个人和第i+1个人合买所需时间.
时间转化 在这个题里比较坑,12:00:00是am,但是12:00:01-12:59:59都是pm,然后剩下的就是从1点开始了..应该的都是小于24:00:00的吧..hdu的题目用翻译还是很好看懂的..
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define inf 2139062143
int dp[2333],dan[2333],he[2333];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&dan[i]);
for(int i=1; i<n; i++)
scanf("%d",&he[i]);
dp[0]=0;
for(int i=1; i<=n; i++)
{
dp[i]=dan[i]+dp[i-1];
if(i!=1)
dp[i]=min(dp[i],dp[i-2]+he[i-1]);
}
int h,m,s;
h=dp[n]/3600;
m=dp[n]%3600/60;
s=dp[n]%60;
h+=8;
if(h<12||h==12&&m==s&&s==0)
printf("%02d:%02d:%02d am\n",h,m,s);
else
{
if(h!=12)
h-=12;
printf("%02d:%02d:%02d pm\n",h,m,s);
}
}
return 0;
}