题意:有 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 }
View Code