题意:有 k 个人需要买电影票,a[i] 表示第 i 个人单独买票要花费的时间,b[i] 表示第 i-1 个和第 i 个人一起买票需要花费的时间,问卖给所有人各一张票最少需要到什么时候。
dp[i]表示卖完第 i 个人需要花费的最短时间
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
初始化:dp[0]=0;dp[1]=a[1];
1 #include<stdio.h>
2 #include<string.h>
3 const int maxn=2e3+5;
4 int a[maxn],b[maxn];
5 int dp[maxn];
6
7 inline int min(int a,int b){return a<b?a:b;}
8
9 int main(){
10 int T;
11 scanf("%d",&T);
12 while(T--){
13 int n;
14 scanf("%d",&n);
15 for(int i=1;i<=n;++i)scanf("%d",&a[i]);
16 for(int i=2;i<=n;++i)scanf("%d",&b[i]);
17 memset(dp,0x3f,sizeof(dp));
18 dp[0]=0;
19 dp[1]=a[1];
20 for(int i=2;i<=n;++i){
21 dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
22 }
23 int hour=8+dp[n]/3600;
24 int min=dp[n]%3600/60;
25 int sec=dp[n]%60;
26 bool f=0;
27 if(hour>12){
28 f=1;
29 hour-=12;
30 }
31 if(hour<10)printf("0");
32 printf("%d:",hour);
33 if(min<10)printf("0");
34 printf("%d:",min);
35 if(sec<10)printf("0");
36 printf("%d ",sec);
37 if(f)printf("pm\n");
38 else printf("am\n");
39 }
40 return 0;
41 }