Finding Lines UVALive - 6955 随机

首先先判断一下一道题的数据范围

如果提交代码出现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;
}

猜你喜欢

转载自blog.csdn.net/qq_41568836/article/details/81835190