【第二次排位_Attempted】
HDU 1260 Tickets
- 题意:有K张单人票,有各自的出票时间,有K-1张双人票,有各自的出票时间。这个双人票是第(1,2)(2,3)(3,4)……这样的组成两个人的出票时间。问最少多长时间卖掉所有的票。DP方程列出来做就是了。
- My_Feeling:比赛的时候还有不到半个小时做这道题,一直没有读懂题。太诡异了这个题意。按照正常生活中电影票出,肯定是一张一张的出撒,所以我还记录了双人票在当前状态下用了多少张。鬼知道它是这样直接上张不用直接不要了,要下张。而且,当时的时候也没有想到用DP来做,反正就是题意也没想对,方法也没相对叭。后来比赛完补题,我发现还是过不了,后来问了学长才知道是我题意理解错了。tcl
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define P(x) x>0?x:0
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef vector<int>:: iterator VITer;
const int maxn=2e3+5;
int k;
int t;
int N;
int s[maxn],d[maxn];
int dp[maxn];//到第m个人的时候的最少时间
int main()
{
scanf("%d",&N);
while(N--)
{
scanf("%d",&k);
t=0;
for(int i=1;i<=k;i++)
scanf("%d",&s[i]);
for(int i=2;i<=k;i++)
scanf("%d",&d[i]);
fill(dp,dp+k+1,0);
dp[1]=s[1];
for(int i=2;i<=k;i++)
dp[i]=min(dp[i-1]+s[i],dp[i-2]+d[i]);
t=dp[k];
int h=t/3600;
t-=h*3600;
int m=t/60;
t-=m*60;
h+=8;
if(h<=12)
printf("%.2d:%.2d:%.2d am\n",h,m,t);
else
{
h-=12;
printf("%.2d:%.2d:%.2d pm\n",h,m,t);
}
}
return 0;
}