Tickets HDU - 1260 简单递推 (基础dp专题)

著名的宫崎骏动画片《千与千寻》在中传1500报重映,中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票,所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞,就可以免费领取一张电影票。带着对童年的回忆,大家早早的就排队等待领票。为了让大家能够早点领取到心仪的门票,动画学院学生会想知道他们什么时候可以最快把票发完?
最好的方法就是分好几处同时发票,并且在每处都尽量减少票的领取时间,让相邻的人一起领票。但是因为每处都只有两位同学在发票,因此每次只能是单个人领票或者相邻两个人一起领票,人再多就容易处理不过来导致出错或降低效率。
作为理工科的你们,更善于推理和计数,假设你们知道各处排队的人数、每个人领票所需的时间,以及相邻的两个人一起领票所需的时间。你们能否帮助动画学院学生会计算一下各处分别最早能在什么时候把票发完吗?
输入
动画学院学生会同时在N(1<=N<=10) 处发放票,每处情况用3行数据表示:
1)第一行为一个整数K(1<=K<=2000) ,表示排队的总人数;
2)第二行包含K个整数Si (1<=i<= K,0<=Si<=25) ,表示每个人领票所需的时间(单位秒);
第三行包含K-1个整数Di (1<=i<= K-1,0<=Di<=50) ,表示相邻两个人一起领票所需的时间(单位秒)。
输出
对每个发票地点,请帮动画学院学生会算一下他们各处最早能在什么时候把票发完。我们假设他们均在08:00:00 am开始发票。输出的时间格式为HH:MM:SS am|pm。
输入样例
2
2
20 25
40
1
8
输出样例
08:00:40 am
08:00:08 am
因为每次只能是单个人领票或者相邻两个人一起领票,所以有两种买票方式。用dp【i】记录前i个人买票所要的时间,动态转移方程为dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1])注意它给的输出格式。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=2005;
#define N 100000;
int main()
{
     
	int t;
	int a[maxn],b[maxn];
	cin>>t;
	while(t--){
     
		int num;
		cin>>num;
		for(int i=1;i<=num;i++)
			cin>>a[i];
		for(int i=1;i<=num-1;i++)
			cin>>b[i];
		int dp[maxn];
		dp[1]=a[1];
		for(int i=2;i<=num;i++){
     
			dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
		}
		int h,m,s;
		h=dp[num]/3600;
		m=(dp[num]-h*3600)/60;
		s=(dp[num]-h*3600)-m*60;
		h=h+8;
		if(h>12)
			printf("%02d:%02d:%02d pm\n",h,m,s);
		else
			printf("%02d:%02d:%02d am\n",h,m,s);
	}
  return 0;
}

你可能感兴趣的:(dp)