[簡單DP]Tickets HDU - 1260
題目大意:對於每個樣例,告訴你需要賣票給K個人,每次可以賣1張或者兩張,然後告訴你K個數字,分別是賣給K個人需要的時間,最後告訴你K-1個數字,是第i-1和第i個人的票一起售出的時間。從八點開始賣票,問最早什麼時候可以賣完。
分析:DP,只有一個變量,就是賣到第I個人所需要的時間,定義dp[i]。但是我們發現每次決策都有兩種,一是當前這個人單獨賣出,二是和前一個人一起賣出。所以我們需要用0,1來表示出這兩種情況。0表示當前人的票單獨賣出,1表示當前人的票和前一個人一起賣出。最後min(dp[k][0],dp[k][1])就是答案。
狀態轉移方程:
dp[i][0]=min(dp[i-1][0],dp[i-1][1])+num2[i];(i-1人的兩種情況)
dp[i][1]=dp[i-1][0]-num1[i-1]+num2[i];(如果當前人的票和前一個人的票一起賣出,那麼當前售出總時間就是售出i-2張的總時間加上售出i和i-1張票的時間)
代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#define MAX 999999999
#define MIN -1
#define ll long long
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
while(n--)
{
int k;
scanf("%d",&k);
int num1[2005];
for(int i=1;i<=k;i++)
scanf("%d",&num1[i]);
int num2[2005];
for(int i=2;i<=k;i++)
scanf("%d",&num2[i]);
int dp[2005][2];
dp[1][0]=num1[1];
dp[1][1]=MAX;
for(int i=2;i<=k;i++)
{
dp[i][0]=min(dp[i-1][1],dp[i-1][0])+num1[i];
dp[i][1]=dp[i-1][0]-num1[i-1]+num2[i];
//printf("qqqqqqqqqqqqqq%d %d\n",dp[i][1],dp[i][0]);
}
int re=min(dp[k][0],dp[k][1]);
int s=re%60;
int m=re/60;
int h=8+m/60;
m%=60;
if(h<12)
printf("%02d:%02d:%02d am\n",h,m,s);
else
printf("%02d:%02d:%02d pm\n",h-12,m,s);
}
}
return 0;
}