题目链接:
题意:给你n个二维坐标点,xi,yi的绝对值在1e9以内,然后问你能不能用两条直线穿过所有点。可以输出YES,不可以输出NO。
分析:当n<=4时,我们知道肯定是输出YES的。当n>4时,如果一条之间可以直接穿过所有点,那么就直接输出YES,否则选不共线的三个点,可以确定三条直线。比如选取1,2,3三个点,那么我们以1和2确定一条直线,判断这个n个点,如果有某个点不在这条直线上,我们就让他和3重新构成一条直线。如果这两条直线能穿过所有点,那么久输出YES,如果没能穿过所有点,我们就枚举剩下的情况,分别以1,3和2,3来当初始确定的直线。如果这三种情况都不可以,那么就输出NO。判断点在直线上应该比较简单,这里就不细说了。
AC代码:
1 #include2 3 using namespace std; 4 5 struct st{ 6 long long x,y; 7 }a[100005]; 8 int n; 9 int judge(int c1,int c2,int c3){ 10 long long x1=a[c2].x-a[c1].x; 11 long long y1=a[c2].y-a[c1].y; 12 long long x2=0; 13 long long y2=0; 14 long long d=__gcd(x1,y1); 15 x1/=d; 16 y1/=d; 17 if(x1<0){ 18 x1*=-1; 19 y1*=-1; 20 } 21 int ans1=0,ans2=0; 22 for(int i=1;i<=n;i++){ 23 if(i!=c1&&i!=c2&&i!=c3){ 24 long long x3=a[i].x-a[c1].x; 25 long long y3=a[i].y-a[c1].y; 26 long long x4,y4; 27 if(x2!=0||y2!=0){ 28 x4=a[i].x-a[c3].x; 29 y4=a[i].y-a[c3].y; 30 d=__gcd(x4,y4); 31 x4/=d; 32 y4/=d; 33 if(x4<0){ 34 x4*=-1; 35 y4*=-1; 36 } 37 } 38 d=__gcd(x3,y3); 39 x3/=d; 40 y3/=d; 41 if(x3<0){ 42 x3*=-1; 43 y3*=-1; 44 } 45 //cout< < >n; 73 for(int i=1;i<=n;i++){ 74 cin>>a[i].x>>a[i].y; 75 } 76 if(n<=4){ 77 cout<<"YES"<