这道题没想到会这么快AC,就是初步的想了一下动态转移方程,写了个代码:
动态转移方程为:Dp[0][i]=Min(Dp[0][i-1]+ar[i],Dp[1][i-1]+ar[i]);
Dp[1][i]=Dp[0][i-1]+ans[i-1]-ar[i-1];
其中Dp[1][i]代表这个人和前面一个人一起买的,Dp[0][i]代表自己一个人买的
![hdu <wbr>1260 <wbr>Tickets hdu <wbr>1260 <wbr>Tickets](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
代码:
#include<stdio.h>
int Dp[2][2004];
int ar[2005],ans[2005];
int n;
int Min(int x,int y){
return x<y?x:y;
}
void make(){
int i,t;
Dp[0][0]=0;
Dp[1][0]=0;
ans[0]=ar[1];
for(i=1;i<=n;i++){
Dp[0][i]=Min(Dp[0][i-1]+ar[i],Dp[1][i-1]+ar[i]);
Dp[1][i]=Dp[0][i-1]+ans[i-1]-ar[i-1];
}
n=Min(Dp[0][n],Dp[1][n]);
}
void Cou(int x){
if(x<10)
printf("0");
printf("%d",x);
}
void Pin(int h,int m,int s){
printf(" ");
if(h<12)
printf("am\n");
else{
printf("pm\n");
}
}
void Output(){
int h=8,m=0,s=0;
h+=n/3600;
n%=3600;
m+=n/60;
n%=60;
s+=n;
Cou(h);
printf(":");
Cou(m);
printf(":");
Cou(s);
Pin(h,m,s);
}
int main(){
int i,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&ar[i]);
for(i=1;i<n;i++)
scanf("%d",&ans[i]);
make();
Output();
}
return 0;
}