题意:给 n(10^5)个点,问是否满足超过%p的点在同一条直线上。
思路:枚举任意两点的搞肯定超时,我也是第一次知道随机化过题(知乎上看到)。随机选择任意两点,在枚举一遍。这题时限是20s,我尝试随机500,1000,10000都可以过。
#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
int x[N],y[N];
bool check(int a,int b,int c){
return (x[b]-x[a])*(y[c]-y[a])==(y[b]-y[a])*(x[c]-x[a]);
}
int main(){
int n,p;
while(~scanf("%d%d",&n,&p)){
int ans=n*p;
for(int i=0;i<n;i++){
scanf("%d%d",&x[i],&y[i]);
}
if(n<=2){
printf("possible\n");
continue;
}
srand(time(0));
int ok=0;
for(int i=1;i<10000;i++){
int u=rand()%n,v=rand()%n,cnt=2;
while(v==u) v=rand()%n;
for(int j=0;j<n;j++){
if(j!=v&&j!=u&&check(u,v,j)) cnt++;
}
if(cnt*100>=ans) {ok=1;break;}
}
printf("%s\n",ok==1?"possible":"impossible");
}
}