题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260
思路:
很简单的DP题,状态方程也比较容易想到,用f[i]表示到第i个人所耗的最短时间,详见代码。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,k,s[2005],d[2005],f[2005]; 5 6 int main(){ 7 scanf("%d",&n); 8 while(n--){ 9 memset(f,0,sizeof(f)); 10 scanf("%d",&k); 11 for(int i=0;i<k;i++) 12 scanf("%d",&s[i]); 13 for(int i=0;i<k-1;i++) 14 scanf("%d",&d[i]); 15 f[0]=s[0];f[1]=min(f[0]+s[1],d[0]); 16 for(int i=2;i<k;i++) 17 f[i]=min(f[i-1]+s[i],f[i-2]+d[i-1]); 18 int hh=8,mm=0,ss=0; 19 hh+=f[k-1]/3600; 20 f[k-1]%=3600; 21 mm+=f[k-1]/60; 22 f[k-1]%=60; 23 ss+=f[k-1]; 24 if(hh<10) printf("0"); 25 printf("%d:",hh); 26 if(mm<10) printf("0"); 27 printf("%d:",mm); 28 if(ss<10) printf("0"); 29 printf("%d ",ss); 30 if(hh<=12) printf("am "); 31 else printf("pm "); 32 } 33 return 0; 34 }