社区讨论
暴力程序,求大佬解答
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 条回复,欢迎继续交流。
正在加载回复...