题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260
题意是有n个人排队买票,第 i 个人买票所需要的时间是a[i],这个人和 i-1 或者 i+1 合买的时间是b[i];
当然每个人都要等到前面所有的人都买完了才能买,我们求所需总时间至少是多少,工作人员早上8点上班,问几点才能下班;
dp[i] 表示前i个人所发费的最小总时间,那么第i个人有两种选择自己买或者和前面的一起买(和后面一起买可以看成后面的人和他前面的人一起买)所以
dp[i] = min(dp[i-1] + a[i], dp[i-2]+b[i]);
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define N 2100 #define INF 0xffffff int main() { int T, n, a[N], b[N], dp[N]; scanf("%d", &T); while(T--) { scanf("%d", &n); memset(dp, 0, sizeof(dp)); for(int i=0;i<=n+1; i++) a[i]=b[i]=INF; for(int i=2; i<=n+1; i++) scanf("%d", &a[i]); for(int i=3; i<=n+1; i++) scanf("%d", &b[i]); for(int i=2; i<=n+1; i++) dp[i]=min(dp[i-1]+a[i], dp[i-2]+b[i]); n=n+1; int s=dp[n]%60; int m=dp[n]/60%60; int h=8+dp[n]/3600; if(h>12) printf("%02d:%02d:%02d pm ", h-12, m, s); else printf("%02d:%02d:%02d am ", h, m, s); } return 0; }