[簡單DP]Tickets HDU - 1260

           [簡單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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章