【題解】HDU 1260 Tickets

【題目敘述】https://vjudge.net/problem/HDU-1260
【解題想法】DP 遞推

  • 有 K 位客人(1 ~ K)。
  • a[ ]:單人買票花費的時間, a[0] = 0。
  • b[ ]:相鄰兩人一起買票的時間,b[0] = b[1] = 0。
  • dp[i]:服務到第 i 個人時,累計花費的最短時間。初始值INF,dp[1] = a[1]。
  • 狀態轉移方程:
    • dp[i] = min(dp[i-1] + a[i], dp[i-2] + b[i]);
  • 注意列印格式,”am|pm” 位小寫。
  • 用printf( )列印 C++字串:透過 str.c_str() 轉換。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 0x3F3F3F3F
int N, K;
int a[2005], b[2005], dp[2005];

void printTime(int t){
    int hour = t / 3600;
    int min = (t - hour * 3600) / 60;
    int sec = t - hour * 3600 - min * 60;
    hour += 8;
    string flag;
    if (hour > 12){
        hour -= 12;
        flag = "pm";
    } else {
        flag = "am";
    }
    printf("%02d:%02d:%02d %s\n", hour, min, sec, flag.c_str());
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    while (N--){
        cin >> K;
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        b[1] = INF;
        for (int i=1; i<=K; i++){
            cin >> a[i];
        }
        for (int i=2; i<=K; i++){
            cin >> b[i];
        }
        memset(dp, 0x3F, sizeof(dp));
        dp[1] = a[1];
        for (int i=2; i<=K; i++){
            if (i == 2){
                dp[i] = min(dp[i-1] + a[i], b[i]);
            } else {
                dp[i] = min(dp[i-1] + a[i], dp[i-2] + b[i]);
            }
        }
        printTime(dp[K]);
    }
    return 0;
}
分享本文 Share with friends