WA on #11 95分求助
查看原帖
WA on #11 95分求助
614654
Dovish楼主2023/8/1 16:10

很朴素的状压做法,不知道为什么只有这个点的第三组数据不对

#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';
	}	
}
2023/8/1 16:10
加载中...