题解
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;
}
标签:直线,Many,Make,long,poi,y2,ll,Triangles
From: https://www.cnblogs.com/pure4knowledge/p/18091218