1. 程式人生 > >題解報告:hdu 1260 Tickets

題解報告:hdu 1260 Tickets

耗時 out 目的 dp問題 include pan apple show end

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1260

解題思路:這是一道簡單的DP問題,題目的意思就是有兩種購票方式,要麽采用單獨購票,要麽采用雙人購票。

即得到狀態轉移方程:dp[i] = min(dp[i - 1] + tim[i], dp[i - 2] + together[i]);兩種情況:①前面i-1個人所消耗的時間加上個人當前購票時間;②前i-2個人購票時間加上當前兩個人購票的時間;取這兩種情況的最小值即為最小花費時間。之後還要對時間顯示格式進行處理,這裏應該是12小時制,即超過12小時顯示為pm且取余12。好了,上代碼。

AC代碼:

 1
#include<bits/stdc++.h> 2 using namespace std; 3 int tim[2005],together[2005],dp[2005]; 4 int main() 5 { 6 int N,K; 7 cin>>N; 8 while(N--){//表示N個場景 9 cin>>K;//表示總人數 10 for(int i=1;i<=K;i++)cin>>tim[i];//讀入單個人購票消耗時間 11 for(int i=1;i<=K-1;i++)cin>>together[i];//
讀入兩人購票消耗的時間 12 dp[0]=0,dp[1]=tim[1];//兩個人開始的話dp[0]=0,同時dp[1]=tim[1]是選擇第一個人進來 13 for(int i=2;i<=K;i++) 14 dp[i]=min(dp[i-1]+tim[i],dp[i-2]+together[i-1]);//遞推式 15 int sec=dp[K]%60;//保存秒 16 int minu=(dp[K]/60)%60;//保存分鐘 17 int hour=dp[K]/3600+8;//保存時鐘 18 int flag=0
;//標記是否超過12點 19 if(hour>12){flag=1;hour%=12;} 20 printf("%02d:%02d:%02d ",hour,minu,sec); 21 if(flag)cout<<"pm"<<endl; 22 else cout<<"am"<<endl; 23 } 24 return 0; 25 }

題解報告:hdu 1260 Tickets