Tickets
题目大意:
售票员想尽可能早的下班,现在有n个人,每个人购票都有一个时间,然后也给你两个相邻的人一起售票所需的时间,现在要你帮助售票员尽可能快的售完票,并且输出该售票员的下班时间,开始售票时间为
数据范围:
解题思路:
刚开始看数据范围2000,以为要n方做,之后写的时候发现直接一层循环就能实现状态的转移,之后处理一下输出的时间就行了。状态为:
dp[i]代表售完第i的人的票所需的最短时间,第一部分是自己一个人售票,第二个是和相邻的前一人一起。
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn = 2000;
int a[maxn + 5], b[maxn + 5];
int hour, minute, second;
int T, n;
int dp[maxn + 5];
int main() {
scanf("%d", &T);
while(T--) {
memset(dp, 0, sizeof(dp));
hour = 8;
minute = second = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
for(int i = 1; i < n; i++)scanf("%d", &b[i]);
dp[1] = a[1];
for(int i = 2; i <= n; i++) {
dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + min(a[i - 1] + a[i], b[i - 1]));
}
bool flag = 0;//记录是上午还是下午,下午是从12:00:00开始的,到13:00:00就变成了1:00:00(上下午肯定是12小时制的啦)
second = dp[n];
minute = second / 60;
second %= 60;
hour += minute / 60;
minute %= 60;
if(hour >= 13)hour %= 12, flag = 1;
if(hour < 10)printf("0");
printf("%d:", hour);
if(minute < 10)printf("0");
printf("%d:", minute);
if(second < 10)printf("0");
printf("%d", second);
if(flag == 1)printf(" pm
");
else printf(" am
");
}
return 0;
}