码迷,mamicode.com
首页 > 其他好文 > 详细

【Luogu】P1594护卫队(前缀和+DP)

时间:2017-09-14 10:41:55      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:return   tps   ffffff   ++   sdi   www.   printf   链接   ref   

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;
}

 

【Luogu】P1594护卫队(前缀和+DP)

标签:return   tps   ffffff   ++   sdi   www.   printf   链接   ref   

原文地址:http://www.cnblogs.com/cellular-automaton/p/7518779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!