HDU 1260 Tickets(DP)

65 阅读1分钟

题意:

有n个观众要买票,给出单个观众买票的时间,还有连续两个观众买票的时间,求怎样买票才能最省时间。

思路:

 明显是要dp了,状态转移方程dp[i]=min(single[i]+dp[i-1],to[i]+dp[i-2]);其中to[i]代表第i-1个人和第i个人一起买票的时间,sing[i]代表第i个人单独买票的时间。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int dp[2100],single[2100],to[2100];
void display(int t){
	int h=8,m=0,s=0;
	m+=t/60;s=t%60;
	h+=m/60;m=m%60;
	if(h>=12) printf("%02d:%02d:%02d pm\n",h-12,m,s);
	else printf("%02d:%02d:%02d am\n",h,m,s);
}
int main(){
	int t,k;
	scanf("%d",&t);
	while(t--){
		//memset(dp,0,sizeof(dp));
		int sum=0;
		scanf("%d",&k);
		for(int i=1;i<=k;i++){
				scanf("%d",&single[i]);
		}
		for(int i=2;i<=k;i++){
				scanf("%d",&to[i]);
		}
		to[1]=single[1];
		dp[0]=0;
		dp[1]=single[1];
		if(k==1) sum=single[1];
		else{
			for(int i=2;i<=k;i++){
				dp[i]=min(single[i]+dp[i-1],to[i]+dp[i-2]);
			}
			sum=dp[k];
		}
		display(sum);
		
	}
	return 0;
} 


\