题目
二维坐标面上
给你N个点,试判断,能否用2条线把N个点都连上。
题解思路
从结果逆向出发,
如果1 和2 且 1 和 3 不共线
那么 2 3 必然共线。
如果不满足则不可能用2条线连上。
思维拉满。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
long long x[N] , y[N] ;
int n ;
bool gx(int a , int b , int c , int d )
{
return ( x[b] - x[a] )*( y[d]-y[c] ) == ( x[d] - x[c] )*( y[b] - y[a] ) ;
}
int che(int a , int b )
{
vector <int> pk ;
for (int i = 1 ; i <= n ; i++ )
if ( !gx(a,b,b,i) )
pk.push_back(i) ;
if ( pk.size() < 3 )
return 1 ;
for (int i = 0 ; i < pk.size() ; i++ )
{
if ( !gx(pk[0],pk[1],pk[1],pk[i]))
return 0 ;
}
return 1 ;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
cin >> x[i] >> y[i];
if ( n <= 4 )
cout << "YES\n";
else
{
if ( che(1,2)||che(1,3)||che(2,3))
{
cout << "YES\n" ;
}else
cout << "NO\n" ;
}
return 0 ;
}