首先先判断一下一道题的数据范围
如果提交代码出现runtime error :rand的数据范围可以超过题目所给的范围,所以就可以用了
如果出现 Time Limit Exceeded :rand的数据范围超不过题目所给的范围,一直在无限循环。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<assert.h>
using namespace std;
int main(){
srand(time(NULL));
for(;;){
assert(rand()<100000);
}
}
题意:判断n个点,是否有百分之p个点在一条直线上
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<set>
#include<vector>
#include<sstream>
#include<queue>
#include<time.h>
#define PI 3.1415926535897932384626
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+10;
struct point
{
int x,y;
}p[maxn];
bool check(point p1,point p2,point p3)
{
if((p2.y-p1.y)*(p3.x-p2.x)==(p3.y-p2.y)*(p2.x-p1.x)) return true;
return false;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int c;
scanf("%d",&c);
srand(time(0));
int t=c*n;
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
if(n<=2)
{
printf("possible\n");
continue;
}
int flag=1;
for(int i=0;i<500;i++)
{
int u,v;
u=rand()%n;
while(1){
v=rand()%n;
if(v!=u)break;
}
//cout<<u<<" "<<v<<endl;
int cnt=2;
for(int j=0;j<n;j++){
if(j==u||j==v)continue;
if(check(p[u],p[v],p[j]))cnt++;
//cout<<cnt<<endl;
}
if(cnt*100>=t){
printf("possible\n");
flag=0;
break;}
}
if(flag)printf("impossible\n");
}
return 0;
}