【Luogu】P1594护卫队(前缀和+DP)
TM搞了半天的二维DP方程还是错的。
这是题目链接:
设f[i]表示前i辆车顺利通过的最小时间。
则对于每一个i枚举该组车的起点j,然后从所有的f[j]+Min[j][i]中选一个最小的。
Min[j][i]表示从第j辆车到第i辆车最慢的是个什么速度。
#include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } double f[1010]; long long Min[1010][1010]; long long ton[10000]; long long que[10000]; int main(){ memset(Min,127/3,sizeof(Min)); long long Max=read(),len=read(),n=read(); for(int i=1;i<=n;++i){ ton[i]=read()+ton[i-1]; que[i]=read(); for(int j=1;j<=i;++j){ f[i]=0x7fffffff; Min[j][i]=min(Min[j][i-1],que[i]); } } for(int i=1;i<=n;++i){ f[i]=f[i-1]+len*1.0/que[i]; for(int j=i-1;j;--j){ if(ton[i]-ton[j-1]>Max) break; f[i]=min(f[i],f[j-1]+len*1.0/Min[j][i]); } } printf("%.1lf",f[n]*60); return 0; }