社区讨论

暴力程序,求大佬解答

P1850[NOIP 2016 提高组] 换教室参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi6h3rjq
此快照首次捕获于
2025/11/20 04:46
4 个月前
此快照最后确认于
2025/11/20 04:46
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,v,e;
int c[2004];
int d[2004];
double k[5004];
int D[304][304];
int x,y,z;
double a,b;
int ans=0;
int main(){
    scanf("%d%d%d%d",&n,&m,&v,&e);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    for(int i=1;i<=n;i++) scanf("%lf",&k[i]);
    for(int i=1;i<=v;i++){
        for(int j=1;j<=n;j++) {
            if(i==j) D[i][j]=0;
            else D[i][j]=99999999;
        }
    }
    for (int i=1; i<=e; i++){
        scanf("%d%d%d",&x,&y,&z);
        if (x==y) continue;
        if (z<D[x][y]) D[x][y]=z;
        D[y][x]=D[x][y];
    }
    for(int k=1;k<=v;k++){
        for(int i=1;i<=v;i++){
            for(int j=1;j<=v;j++){
                if(D[i][k]+D[k][j]<D[i][j]){
                    D[i][j]=D[i][k]+D[k][j];
                }
            }
        }
    }
    for(int i=2;i<=n;i++){
        ans+=D[c[i-1]][c[i]];
    }
        D[c[1]][c[0]]=0;
        D[d[1]][c[0]]=0;
        D[c[n]][c[n+1]]=0;
        D[d[n]][c[n+1]]=0;
    if(m==0){
        printf("%0.2lf",1.0*ans);
        return 0;
    }
    if(m==1){
        a=min(1.0*ans,k[1]*(ans-D[c[1]][c[2]]+D[d[1]][c[2]])+(1.0-k[1])*ans);
        for(int i=2;i<=n;i++){
            a=min(a,k[i]*(ans-D[c[i]][c[i+1]]+D[d[i]][c[i+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]])+(1.0-k[i])*ans);
        }
        printf("%0.2lf",a);
        return 0;
    }
    if(m==2){
        a=ans*1.0;
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                if(i==j){
                    a=min(a,k[i]*(ans-D[c[i]][c[i+1]]+D[d[i]][c[i+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]])+(1.0-k[i])*ans);
                }
                else if(j==i+1){
                    a=min(a,k[i]*k[j]*(ans-D[c[j]][c[j+1]]+D[d[j]][c[j+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]]-D[c[i]][c[j]]+D[d[i]][d[j]])+(1.0-k[j])*k[i]*(ans-D[c[i]][c[i+1]]+D[d[i]][c[i+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]])+(1.0-k[i])*k[j]*(ans-D[c[j]][c[j+1]]+D[d[j]][c[j+1]]-D[c[j]][c[j-1]]+D[d[j]][c[j-1]])+(1.0-k[i])*(1.0-k[j])*ans);
                }
                else a=min(a,k[i]*k[j]*(ans-D[c[j]][c[j+1]]+D[d[j]][c[j+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]]-D[c[i]][c[i+1]]+D[d[i]][c[i+1]]-D[c[j]][c[j-1]]+D[d[j]][c[j-1]])+(1.0-k[j])*k[i]*(ans-D[c[i]][c[i+1]]+D[d[i]][c[i+1]]-D[c[i]][c[i-1]]+D[d[i]][c[i-1]])+(1.0-k[i])*k[j]*(ans-D[c[j]][c[j+1]]+D[d[j]][c[j+1]]-D[c[j]][c[j-1]]+D[d[j]][c[j-1]])+(1.0-k[i])*(1.0-k[j])*ans);
            }
        }
        printf("%0.2lf",a);
        return 0;
    }
}
我是仅做了当m=0,1,2的时候的情况,枚举,但为什么仅过了8个点

回复

0 条回复,欢迎继续交流。

正在加载回复...