poj2336
题目大意:一个船要把n个车渡过河 船最多载m辆车 把车运过去需要t的时间 回来也要t的时间
给定n辆车依次到河边的时间 求最短运送时间 还有最短跑几趟
一维dp 可以直接d运送时间
dp[i]=min{max(time[i],dp[j]+t)+t} (i-n=<j<i)
time[i]表示第i辆车到达时间,trip[i]表示第i辆车最少几趟
trip[i]=min{trip[j]}+1
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> using namespace std; const int maxn=2000; int dp[maxn],trip[maxn],tim[maxn],n,t,m,i,j; int main() { int T; cin>>T; while(T--) { cin>>n>>t>>m; memset(dp,0xff,sizeof(dp)); memset(trip,0,sizeof(trip)); for(int i=1;i<=m;i++)cin>>tim[i]; dp[0]=-t; dp[1]=tim[1]+t; trip[1]=1; for(i=2;i<=m;i++) { for(j=max(0,i-n);j<i;j++) { int tmp=max(dp[j]+t,tim[i])+t; if(dp[i]==-1) { dp[i]=tmp; trip[i]=trip[j]+1; continue; } if(tmp<dp[i]) { dp[i]=tmp; trip[i]=trip[j]+1; } } } cout<<dp[m]<<" "<<trip[m]<<'\n'; } //system("pause"); return 0; }