HDU1260 tickets(简单DP)
状态转移方程:
dp[i] = min(dp[i-1] + a[i], dp[i-2] + b[i-1]);
第i个人买票,可以决定是单买好,还是和后边一个人合买好。dp[i]数据描述的是前i个人买票用的时间。注意输出格式,完事~
注意第二个是加上b[i-1],因为输入合买数据时是从1开始输入的,比如dp[2]=min(dp[1]+a[2],dp[0]+b[1])。
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
using namespace std;
int a[2000];
int b[2000];
int dp[2000];
int main()
{
int t,K,ans;
int HH, MM, SS;
cin >> t;
while (t--)
{
ans = 0;
cin >> K;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(dp, 0, sizeof(dp));
ans = 0;
for (int i = 1; i <= K; i++)
cin >> a[i];
for (int i = 1; i <= K - 1; i++)
cin >> b[i];
dp[0] = 0;
dp[1] = a[1];
for (int i = 2; i <= K; i++) {
dp[i] = min(dp[i-1] + a[i], dp[i-2] + b[i-1]); //输入的合买数据是从第一个开始输入的!!
}
ans =dp[K];
HH =ans/3600;
MM = (ans - 3600 * HH) / 60;
SS = (ans - 3600 * HH - 60 * MM) % 60;
HH += 8;
if(HH<=12)
printf_s("%02d:%02d:%02d am\n", HH, MM, SS);
else
printf_s("%02d:%02d:%02d pm\n", HH, MM, SS);
}
return 0;
}