UVA6955 Finding Lines (random)
传送门:https://vjudge.net/contest/146124#problem/A
题意:给N个点,问是否存在一条直线经过$p\%$个点。
思路:暴力枚举妥妥的TLE,随机大法好!因为 $p\geq20$,所以迭代200次,
如果存在一条合法直线,但我萌没发现它的概率大于: $1 - 0.8^{200}$如果
这都没找到,那买彩票去吧!
PS: $n\leq2$时需要特判一下。
#include <iostream>
#include <cstdio>
using namespace std;
const int NICO = 100000+10;
typedef long long LL;
int n, p;
LL x[NICO], y[NICO];
bool check(int a, int b)
{
int cnt = 0;
for(int i=0;i<n;i++)
{
if( (y[i]-y[b]) * (x[i]-x[a]) == (y[i]-y[a])*(x[i]-x[b]) ) cnt ++;
}
return cnt >= (n*p+99)/100;
}
int main()
{
while(~scanf("%d %d", &n, &p))
{
for(int i=0;i<n;i++)
{
scanf("%lld %lld", &x[i], &y[i]);
}
int ok = 0;
for(int i=1;i<=200;i++)
{
int a = rand()%n;
int b = rand()%n;
if(a == b) continue;//两点是同一个点的话,小心了。
if(check(a, b)) ok = 1;
}
printf("%s\n", (ok||n<=2)?"possible":"impossible");
}
}

浙公网安备 33010602011771号