HDU-1260 Tickets (简单dp)

题目大意:

k个人排队,每个人单独买票要Si秒,和前面的人一起买要Di秒,求最快多长时间买完票

思路:

dp[i]表示前i人买完票的最短时间

dp[i] = min(dp[i - 1] + s[i], dp[i - 2] + d[i])

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2010;
int dp[maxn], s[maxn], d[maxn];
int t, k;
int main()
{
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d", &k);
		for (int i = 1; i <= k; i++)
		{
			scanf("%d", &s[i]);
		}
		for (int i = 2; i <= k; i++)
		{
			scanf("%d", &d[i]);
		}
		int sec = 0;
		dp[0] = 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]);
		}
		sec = dp[k];
		int min = sec / 60;
		sec %= 60;
		int hour = 8 + min / 60;
		min %= 60;
		if (hour > 12) printf("%02d:%02d:%02d pm\n", hour - 12, min, sec);
		else printf("%02d:%02d:%02d am\n", hour, min, sec);
	}
}
 
 
 
发布了28 篇原创文章 · 获赞 8 · 访问量 2809

猜你喜欢

转载自blog.csdn.net/IuSpet/article/details/84836779