B - Make Many Triangles

纯粹的發表於2024-03-23

原題連結

題解

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;
}

相關文章