UVALive - 6955 Finding Lines (随机)

题意: 给你n个点,然后在给你一个概率。问是否有p%n 个点共线 (p>=20&&p<=100)。

思路:如果要问有多少个点共线我们可以枚举所有可以组成的直线然后去判断共线数目,然而如果要求出所有的直线恐怕再怎么说都会超时。所以我们尝试随机枚举:

随机找两个点以及其形成的直线(即寻找随机直线),如果超过k条随机直线都没有符合条件则就当不存在这样的直线,否则存在。

#include <bits/stdc++.h>
 
using namespace std;
const int maxn=1e5+7;
int a[maxn],b[maxn];
int main()
{
    int i,j;
    int n,p;
    while(~scanf("%d%d",&n,&p))
    {
        int sum;
        p = (p*n);
        for(i=0;i<n;++i) scanf("%d%d",&a[i],&b[i]);
        if(n<=2)
        {
            puts("possible");
            continue;
        }
        for(i=0;i<1000;++i)
        {
            sum=2;
            int x=rand()%n;
            int y=rand()%n;
            while(y==x)y=rand()%n;
            for(j=0;j<n;++j)
            {
                if(j==x||j==y) continue;
                if((b[y]-b[x])*(a[j]-a[y])-(a[y]-a[x])*(b[j]-b[y])==0) sum++;
                if(sum*100>=p) break;
            }
            if(sum *100 >= p) break;
        }
        if(sum *100 >= p) puts("possible");
        else puts("impossible");
    }
    return 0;
}

 

posted @ 2019-08-16 19:02  Tianwell  阅读(129)  评论(0编辑  收藏  举报