zoukankan      html  css  js  c++  java
  • [NoiPlus2016]换教室

    flag++

    //Writer : Hsz %WJMZBMR%tourist%hzwer
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define LL long long
    #define M(a,b) memset(a,b,sizeof a)
    const int inf=0x3fffffff;
    const double eps=1e-8;
    int in(){
        int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}  return x*f;
    }
    void out(int x)
    {
        int a[25],wei=0;
        if(x<0) putchar('-'),x=-x;
        for(;x;x/=10) a[++wei]=x%10;
        if(wei==0){ puts("0"); return;}
        for(int j=wei;j>=1;--j) putchar('0'+a[j]);
        putchar('
    ');
    }
    int dis[305][305],n,m,v,e,c[2005],d[2005],head[2005],ecnt;
    double p[2005],f[2005][2005][2],ans=inf;
    int main()
    {
        n=in(),m=in(),v=in(),e=in();
        for(int i=1;i<=n;i++)c[i]=in();
        for(int i=1;i<=n;i++)d[i]=in();
        for(int i=1;i<=n;i++)scanf("%lf",&p[i]);
        M(dis,0x3f);
        for(int i=1;i<=v;i++) dis[i][i]=0;
        for(int i=1,a,b,dd;i<=e;i++){a=in(),b=in(),dd=in();dis[a][b]=dis[b][a]=std::min(dis[a][b],dd);}
        
        for(int k=1;k<=v;k++)
            for(int i=1;i<=v;i++)
                for(int j=1;j<i;j++)
                    if(dis[i][j]>dis[i][k]+dis[k][j]) dis[j][i]=dis[i][j]=dis[i][k]+dis[k][j];
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
                f[i][j][0]=f[i][j][1]=inf;
        f[1][0][0]=f[1][1][1]=0;
        for(int i=2;i<=n;i++){
            int mn=std::min(i,m);
            double d1=dis[c[i-1]][c[i]],d2=dis[d[i-1]][c[i]]*p[i-1]+d1*(1-p[i-1]),
            d3=dis[c[i-1]][d[i]]*p[i]+d1*(1-p[i]),d4=d1*(1-p[i])*(1-p[i-1])+dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]+
            dis[d[i-1]][c[i]]*(1-p[i])*p[i-1]+dis[d[i-1]][d[i]]*p[i-1]*p[i];
            for(int j=0;j<=mn;j++){
                f[i][j][0]=std::min(f[i-1][j][0]+d1,f[i-1][j][1]+d2);
                if(j)f[i][j][1]=std::min(f[i-1][j-1][0]+d3,f[i-1][j-1][1]+d4);
            }
        }
        for(int i=0;i<=m;i++)
        for(int j=0;j<=1;j++){
            ans=std::min(ans,f[n][i][j]);
        }
        printf("%.2lf",ans);
        return 0;
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    bzoj 2120 数颜色 带修改莫队
    luogu 2709 小B的询问 莫队
    bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊 分块
    bzoj 4765 普通计算姬 dfs序 + 分块
    loj 数列分块入门 6 9(区间众数)
    loj 数列分块入门 5 7 8
    AtCoder Grand Contest 021 D
    Codeforces Round #466
    office 威胁检测
    修改macos的启动LOGO
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9254076.html
Copyright © 2011-2022 走看看