Codeforces 605E :Intergalaxy Trips

传送门

题解:
如果知道最终的大小关系就比较好做。

不过我们发现最后如果确定了大小关系,那么大的只会从小的转移过来。那么我们现在从小到大逐个确定就好了。

#include <bits/stdc++.h>
using namespace std;
typedef double LD;
const int N=1e3+50;
int n,vis[N]; LD G[N][N],pre[N],sum[N];
inline int rd(int x=0) {return (cin>>x,x);}
int main() {
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            G[i][j]=rd()/100.;
    vis[n]=1; if(n==1) {puts("0"); return 0;}
    for(int i=1;i<n;i++)
        pre[i]=(1.0-G[i][n]), sum[i]=1.;
    for(int i=2;i<=n;i++) {
        LD mn=1e99; int mnid=0;
        for(int j=1;j<=n;j++) if(!vis[j]) {
            LD t=sum[j]/(1.0-pre[j]);
            if(t<mn) mn=t, mnid=j;
        } vis[mnid]=1; 
        if(mnid==1) return printf("%.15f\n",(double)mn),0;
        for(int j=1;j<=n;j++) if(!vis[j]) {
            sum[j]+=pre[j]*G[j][mnid]*mn;
            pre[j]=pre[j]*(1.-G[j][mnid]);
        }
    }   
}

猜你喜欢

转载自blog.csdn.net/qq_35649707/article/details/80876744