思路:
- 一般动态规划。
- 注意输出格式,%02d,24小时制。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2005;
int N;
int dp[maxn];
int t[maxn];
int tt[maxn];
void INIT(){
return ;
}
void OUTPUT(){
int a = dp[N]/3600;
int b = (dp[N] - 3600*a)/60;
int c = dp[N] - 3600*a - 60*b;
if(a < 4)
printf("%02d:%02d:%02d am\n" , 8+a , b , c);
else
printf("%02d:%02d:%02d pm\n" , 8+a , b , c);
return ;
}
int main(){
int T;cin>>T;
while(T--){
INIT();
cin>>N;
for(int i=1;i<=N;i++)
scanf("%d" , t + i);
for(int i=1;i< N;i++)
scanf("%d" , tt+ i);
dp[0] = 0;
dp[1] = t[1];
dp[2] = min(t[1] + t[2] , tt[1]);
for(int i=3;i<=N;i++)
dp[i] = min(dp[i-1] + t[i] , dp[i-2] + tt[i-1]);
OUTPUT();
}
return 0;
}
二刷:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2005;
int T , N;
int w[maxn];
int ww[maxn];
int dp[maxn];
int main(){
cin>>T;
while(T--){
cin>>N;
for(int i=1;i<=N;i++)
scanf("%d" , w + i);
for(int i=2;i<=N;i++)
scanf("%d" , ww + i);
dp[0] = 0;
dp[1] = w[1];
for(int i=2;i<=N;i++)
dp[i] = min(dp[i-1] + w[i] , dp[i-2] + ww[i]);
int h = dp[N]/3600;
int m = (dp[N]-3600*h)/60;
int s = dp[N]-3600*h-60*m;
if(h < 4)
printf("%02d:%02d:%02d am\n" , 8+h , m , s);
else
printf("%02d:%02d:%02d pm\n" , 8+h , m , s);
}
return 0;
}