原題連結
題解
1.我們可以用若干條直線把所有點串起來,串起來的要求是不同直線不共點,這樣以每條直線上的兩點為底,直線外另一點為頂點配對
令最大的直線上的點數為k,如果n-k>=k/2+k%2,那麼這條直線上的點一定可以被消除。否則不行
就變成了若干集合彼此相消,當最大集合大小超過剩餘集合總和時無法消除乾淨?
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct
{
ll x,y;
}poi[304];
ll cal(ll a,ll b,ll c)
{
ll x1=poi[a].x-poi[c].x,y1=poi[a].y-poi[c].y,x2=poi[b].x-poi[c].x,y2=poi[b].y-poi[c].y;
return x1*y2-x2*y1;
}
int main()
{
ll n;
cin>>n;
for(ll i=1;i<=n;i++) cin>>poi[i].x>>poi[i].y;
ll maxline=0;
for(ll i=1;i<n;i++)
{
for(ll j=i+1;j<=n;j++)
{
ll cnt=0;
for(ll k=1;k<=n;k++)
{
if(cal(i,j,k)==0) cnt++;
}
maxline=max(maxline,cnt);
}
}
cout<<min(n/3,n-maxline)<<endl;
return 0;
}