题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260
题意就是有n个人排队买票,每个人需要的时间是a[i] (1=< i <=N),但是现在可以两个人合买, 合买只能和前面一个人或者后面一个人合买,所用时间已知,
求n个人都买完票所需要的时间;
我们可以用dp【i】表示前i个人需要用的时间,可以分析第i个人他可能自己买(dp[i] == dp[i-1]+a[i]),或者和前面一个人合买(dp[i] == dp[i-2]+b[i-1]);
因为每个人和他后面的一个人合买可以看成后面一个人和前面一个人合买;
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define N 2200 #define INF 0xfffffff int main() { int T, n, a[N], b[N], dp[N]; scanf("%d", &T); while(T--) { memset(dp, 0, sizeof(dp)); scanf("%d", &n); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); } for(int i=1; i<n; i++) { scanf("%d", &b[i]); } dp[1]=a[1]; dp[2]=min(a[1]+a[2], b[1]); for(int i=3; i<=n; i++) { dp[i] = min(dp[i-1]+a[i], dp[i-2]+b[i-1]); } int h = dp[n]/3600+8; int m = dp[n]%3600/60; int s = dp[n]%60; if(h>12) printf("%02d:%02d:%02d pm ", h-12, m, s); else printf("%02d:%02d:%02d am ", h, m, s); } return 0; }