BZOJ 4720 [Noip2016]換教室
阿新 • • 發佈:2018-02-20
pan 是否 最短 ++ gpo const post using con
題解:概率,f[i][j][2]表示到第i天一共申請了j次,第i天的課程是否申請的期望最短路
考場上這題得了0分QWQ
問題:對期望和概率的理解不夠深
讓保留2位小數我TM用了cout,WA了幾發
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=2009; const int oo=1000000000; int n,m,v,e; double k[maxn]; int a[maxn],b[maxn]; int d[maxn][maxn]; double f[maxn][maxn][2]; double ans=oo*1.0; int main(){ scanf("%d%d%d%d",&n,&m,&v,&e); for(int i=1;i<=n;++i)scanf("%d",&a[i]); for(int i=1;i<=n;++i)scanf("%d",&b[i]); for(int i=1;i<=n;++i)scanf("%lf",&k[i]); for(int i=1;i<=v;++i){ for(int j=1;j<=v;++j){ d[i][j]=oo; } } for(int i=1;i<=v;++i)d[i][i]=0; while(e--){ int x,y,z; scanf("%d%d%d",&x,&y,&z); d[x][y]=min(d[x][y],z); d[y][x]=min(d[y][x],z); } for(int p=1;p<=v;++p){ for(int i=1;i<=v;++i){ for(int j=1;j<=v;++j){ d[i][j]=min(d[i][j],d[i][p]+d[p][j]); } } } for(int i=1;i<=n;++i){ for(int j=0;j<=m;++j){ f[i][j][0]=f[i][j][1]=oo*1.0; } } f[1][1][1]=0; f[1][0][0]=0; for(int i=2;i<=n;++i){ for(int j=0;j<=m;++j){ f[i][j][0]=min(f[i-1][j][0]+d[a[i-1]][a[i]],f[i-1][j][1]+k[i-1]*d[b[i-1]][a[i]]+(1-k[i-1])*d[a[i-1]][a[i]]); if(j)f[i][j][1]=min(f[i-1][j-1][0]+k[i]*d[a[i-1]][b[i]]+(1-k[i])*(d[a[i-1]][a[i]]),f[i-1][j-1][1]+k[i-1]*k[i]*d[b[i-1]][b[i]]+(1-k[i-1])*k[i]*d[a[i-1]][b[i]]+k[i-1]*(1-k[i])*d[b[i-1]][a[i]]+(1-k[i-1])*(1-k[i])*d[a[i-1]][a[i]]); } } for(int j=0;j<=m;++j){ ans=min(ans,f[n][j][0]); ans=min(ans,f[n][j][1]); } printf("%.2f\n",ans); return 0; }
BZOJ 4720 [Noip2016]換教室