码迷,mamicode.com
首页 > 编程语言 > 详细

随机算法

时间:2018-06-19 20:07:30      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:check   没有   网站   new   max   div   就是   ext   ide   

  随机算法听起来就很不靠谱...但是有的时候还是很有用的,而且也有正解就是随机化的题目。

  要说定义好像也没什么好讲的,要不先看道题吧。

  

  偷上网:https://www.luogu.org/problemnew/show/P4703

  luogu某次月赛题,当时刚开始看这个题网站就崩溃了,于是也没有怎么想,今天再想还是没有什么思路。

  一开始想到在边上找,又觉得在中间的可能性也很大,所以似乎并没有什么规律。看了题解发现这道题可以用随机化...随机生成一些点,check一下是否满足条件,这样多找几次总能找到答案。写完之后突然想起来还有无解的情况,用数学方法推了一下无果,(于是又去看了题解)。随机10000次如果还没有解就认为是无解,这也太暴力了吧...

  通过这道题还学到了一个技巧,(double)rand()/RAND_MAX*(想要的范围),就可以构造出在0-想要的范围之间的数了.

  技术分享图片
# include <cstdio>
# include <iostream>
# include <cmath>
# include <ctime>
# include <cstdlib>

using namespace std;

int n,l;
double nx,ny,x[11],y[11],dis;
const int maxn=10000;

bool check(double a,double b)
{
    for (int i=1;i<=n;i++)
        if( (x[i]-a)*(x[i]-a)+(y[i]-b)*(y[i]-b)< dis*dis)
            return false;
        return true;
}

int main()
{
    srand(time(0));
    scanf("%d%d",&n,&l);
    for (int i=1;i<=n;++i)
        scanf("%lf%lf",&x[i],&y[i]);
    dis=(double)l/n;
    for (int i=1;i<=maxn;++i)    
    {
        nx=(double)rand()/RAND_MAX*l;
        ny=(double)rand()/RAND_MAX*l;
        if(check(nx,ny))
        {
            cout<<nx<<" "<<ny;
            return 0;
        }
    }
    printf("GG");
    return 0;
}
偷上网

  

   随机化的题也就见过这么一道,以后见到再写。

随机算法

标签:check   没有   网站   new   max   div   就是   ext   ide   

原文地址:https://www.cnblogs.com/shzr/p/9200699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!