很朴素的状压做法,不知道为什么只有这个点的第三组数据不对
#include<bits/stdc++.h>
#define double long double
#define int long long
using namespace std;
int res,tot;
struct sx
{
double a,b;
int val;
bool operator ==(const sx&k)const
{
if(fabs(a-k.a)<1e-9&&fabs(b-k.b)<1e-9)
return true;
else return false;
}
bool operator <(const sx&k)const
{
if(fabs(a-k.a)<1e-9)return a<k.a;
else return b<k.b;
}
};//一条形如ax^2+bx的二次函数
sx get(double x1,double y1,double x2,double y2,int i,int j)
{
sx x;
x.a=(y1*x2/x1-y2)/(x2*(x1-x2));
x.b=(y1-x.a*x1*x1)/x1;
x.val=((1<<i)|(1<<j));
return x;
}//求解一元二次方程
int t,n,sign;double zx[1010],zy[1010],vis[20];
sx f[300010],s[300010];
int dp[300010];
signed main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
memset(dp,63,sizeof(dp));
memset(vis,0,sizeof(vis));
res=0,tot=0;
cin>>n>>sign;
for(int i=0;i<n;i++)
cin>>zx[i]>>zy[i];
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
sx val=get(zx[i],zy[i],zx[j],zy[j],i,j);
if(val.a<0.00&&fabs(val.a)<1e9)
f[++res]=val,vis[i]=vis[j]=1;
}//三点确定一条二次函数
sort(f+1,f+res+1);
for(int i=1;i<=res;i++)
{
if(f[i]==s[tot])s[tot].val|=f[i].val;
else s[++tot]=f[i];
}//把相同的二次函数合并到s中
for(int i=0;i<n;i++)s[++tot].val=(1<<i);
for(int i=1;i<=tot;i++)dp[s[i].val]=1;
dp[0]=0;
for(int i=0;i<(1<<n);i++)
for(int j=1;j<=tot;j++)
{
dp[i|s[j].val]=min(dp[i|s[j].val],dp[i]+1);
}//状压
cout<<dp[(1<<n)-1]<<'\n';
}
}