1、hdu 1260 Tickets
题意:有k个人,售票员可以选择一个人卖,或者同时卖给相邻的两个人。问最少的售票时间。
思路:dp[i] = min(dp[i - 1] + singlep[i], dp[i - 2] + dbp[i - 1]);dp[i]表示卖到第i个人后所需最少时间。注意时间为12小时制。
1 #include<iostream> 2 #include<memory.h> 3 #include<algorithm> 4 using namespace std; 5 int n, k; 6 const int maxk = 2100; 7 int dp[maxk]; 8 int singlep[maxk]; 9 int dbp[maxk]; 10 int main() 11 { 12 scanf("%d", &n); 13 while (n--) 14 { 15 scanf("%d", &k); 16 for (int i = 1; i <= k; i++) scanf("%d", &singlep[i]); 17 for (int i = 1; i <= k - 1; i++) scanf("%d", &dbp[i]); 18 memset(dp, 0, sizeof(dp)); 19 for (int i = 1; i <= k; i++) 20 { 21 if (i == 1)dp[i] = singlep[i]; 22 else 23 { 24 dp[i] = min(dp[i - 1] + singlep[i], dp[i - 2] + dbp[i - 1]); 25 } 26 } 27 int hh = 8; 28 int mm = 0, ss = 0; 29 hh += dp[k]/3600; 30 mm += dp[k]%3600/ 60; 31 ss += dp[k] % 60; 32 char t1[4] = "am", t2[4] = "pm"; 33 printf("%02d:%02d:%02d %s\n", (hh<=12?hh:hh-12), mm, ss, (hh >= 13 ? t2 : t1)); 34 } 35 return 0; 36 }