题意:
有n个观众要买票,给出单个观众买票的时间,还有连续两个观众买票的时间,求怎样买票才能最省时间。
思路:
明显是要dp了,状态转移方程dp[i]=min(single[i]+dp[i-1],to[i]+dp[i-2]);其中to[i]代表第i-1个人和第i个人一起买票的时间,sing[i]代表第i个人单独买票的时间。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int dp[2100],single[2100],to[2100];
void display(int t){
int h=8,m=0,s=0;
m+=t/60;s=t%60;
h+=m/60;m=m%60;
if(h>=12) printf("%02d:%02d:%02d pm\n",h-12,m,s);
else printf("%02d:%02d:%02d am\n",h,m,s);
}
int main(){
int t,k;
scanf("%d",&t);
while(t--){
//memset(dp,0,sizeof(dp));
int sum=0;
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&single[i]);
}
for(int i=2;i<=k;i++){
scanf("%d",&to[i]);
}
to[1]=single[1];
dp[0]=0;
dp[1]=single[1];
if(k==1) sum=single[1];
else{
for(int i=2;i<=k;i++){
dp[i]=min(single[i]+dp[i-1],to[i]+dp[i-2]);
}
sum=dp[k];
}
display(sum);
}
return 0;
}
\