View Code
//hdu 1260 dp //题目说如何最快让每个人买到票,每组数据给出 //第一行:多少人买票(k),第二行:每个人买自己的一张票的时间(k个数), //第三行:连续两个人一起买票的时间(比如 第一个数表示第一个人和 //第二个人一起买的时间,第二个数表示第二个人和第三个人一起的时间...(k-1个数)) //思路:dp[i]表示 到第i 个人买票的最少时间 //因此 dp[i] = min{ dp[i-1] + 第i 个人买票时间, dp[i-2] + (第i-1个人和第i一起买票的时间) } //这样只要知道 dp[i-1] 和dp[i-2] 就可以了,因此可以用滚动数组优化空间 #include <stdio.h> #include <string.h> #define N 2005 int one[N], two[N], dp[3]; int main() { int n_case, n_tick; scanf("%d", &n_case); while(n_case--) { scanf("%d", &n_tick); for(int i = 1; i <= n_tick; ++i) scanf("%d", &one[i]); for(int i = 1; i < n_tick; ++i) scanf("%d", &two[i]); dp[0] = 0; dp[1] = one[1]; for(int i = 2; i <= n_tick; ++i) { //记录到 第 i-1 个人的最少时间 加上 i 买票的时间 int tmp = dp[(i-1) % 3] + one[i]; //记录到 第 i-2 个人的最少时间 加上 (第i-1 个人 和 第i个人一起买票的时间) int now = dp[(i-2) % 3] + two[i-1]; if(now < tmp) //判断哪一种方式买票最省时间 dp[i%3] = now; else dp[i%3] = tmp; // int tmp = dp[i-1] + one[i]; // if(dp[i - 2] + two[i-1] < tmp) // dp[i] = dp[i-2] + two[i-1]; // else // dp[i] = tmp; } int h, m, s; s = dp[n_tick%3] % 60; m = (dp[n_tick%3] / 60) % 60; h = (dp[n_tick%3] / 60 / 60) % 60 + 8; // s = dp[n_tick] % 60; // m = (dp[n_tick] / 60) % 60; // h = (dp[n_tick] / 60 / 60) % 60 + 8; //注意输出格式 printf("%02d:%02d:%02d ", h, m, s); if(h < 12 || !(m+s)) //12:00以前或12:00:00为am puts("am"); else puts("pm"); } return 0; }