Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力 ★ ★

题意

有一个人,在一个图里面开始找罪犯了。

这个人有两天的抓捕机会,他会在每一天都有机会使用BCD机器,这个BCD机器会返回这个罪犯离他的距离是多少。

当然这个人要么在第一天去抓罪犯,要么在第二天去抓罪犯。

这个罪犯也不是一个傻逼,如果那个人第一天不抓他的话,那么第二天的时候,这个罪犯就会转移阵地。

然后现在问你,在最佳情况下,这个人抓住这个罪犯的概率是多少?

题解:

考虑最暴力的情况,枚举罪犯第一天哪儿,第二天在哪儿,枚举警察第一天在哪儿使用BCD,第二天在哪儿使用BCD

这个复杂度是n^4的,显然过不了,但是显然是对的。

我们优化一下。

暴力枚举这个警察第一天在哪儿使用BCD的地点A,暴力枚举BCD返回的距离a,再暴力枚举第二天使用BCD的地点B。

显然罪犯只有可能出现在三种位置,就是距离A地点距离为a,a-1,a+1的三个地方。

这样优化了一下之后,复杂度就变成n^3了,就可以直接莽过去了。

#include
using namespace std;
const double eps = 1e-6;
const int maxn = 405;
int d[maxn][maxn],n,m;
double dis[maxn];
double posi[maxn];
vector E[maxn];
vector f;
void TAT()
{
    memset(d,127,sizeof(127));
}
double next(int p,int di)
{
    double ans = 0;
    memset(posi,0,sizeof(posi));

    for(int i=1;i<=n;i++)
        if(d[p][i]==di)
            for(auto v:E[i])
                posi[v]+=1./n/E[i].size();

    f.clear();

    for(int i=1;i<=n;i++)
        if(posi[i]>eps)
            f.push_back(i);

    for(int i=1;i<=n;i++)
    {
        double tmp = 0;
        for(auto v:f)
            dis[d[i][v]]=max(dis[d[i][v]],posi[v]);
        for(auto v:f)
        {
            tmp+=dis[d[i][v]];
            dis[d[i][v]]=0;
        }
        ans=max(ans,tmp);
    }
    return ans;
}
void QAQ()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j)d[i][j]=n+1;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        d[a][b]=1;
        d[b][a]=1;
        E[a].push_back(b);
        E[b].push_back(a);
    }

    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

    double ans = 0;

    for(int i=1;i<=n;i++)
    {
        double tmp = 0;
        for(int di=0;di


你可能感兴趣的:(思维)