求助,样例全过,测试点全wa
查看原帖
求助,样例全过,测试点全wa
714900
zyzbldnb楼主2023/1/31 16:07
#include<bits/stdc++.h>
using namespace std;
const int maxn=1<<18;
typedef long long ll;
int f[maxn+5],cnt;
double x[20],y[20],a,b;
int c[20];
void ab(double x1,double y1,double x2,double y2)
{
	a=(y1*x2-y2*x1)/(x1*x1*x2-x2*x2*x1);
	b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x2*x1*x1);
	
}
void de(int st)
{
    cnt=0;
	for(int i=0;st>>i;i++)
	{
		if((st>>i)&1) c[++cnt]=i+1;
	}
}
int main()
{
     int t;
     cin>>t;
     while(t--)
     {
     	int n,m;
     	cin>>n>>m;
     	for(int i=1;i<=n;i++)
     	cin>>x[i]>>y[i];
     	for(int i=3;i<1<<n;i++)
     	f[i]=n/2+1;
     	
     	for(int i=1;i<1<<n;i++){
     		de(i);
     	   if(cnt==1) {	f[i]=1;continue;} 
     	  int tt=c[cnt];
     	  for(int j=1;j<cnt;j++){        //选t和c[j]
     	   	ab(x[tt],y[tt],x[c[j]],y[c[j]]); //求a,b
     	   	int tmp=i;
     	   	if(a<0)
     	   	{
     	   	for(int k=1;k<=cnt;k++)	
     	   	 if(a*x[c[k]]*x[c[k]]+b*x[c[k]]==y[c[k]])
     	   	tmp^=(1<<(c[k]-1));        //状态中除去 t(k==cnt),c[j]及其抛物线上的点 -也可
     	   	f[i]=min(f[i],f[tmp]+1);       //tmp<i,之前的状态已经计算完毕
				}
		 	}
		    f[i]=min(f[i^(1<<(tt-1))]+1,f[i]); // 单独处理当前最后一个		 			 	
		  }
     	cout<<f[(1<<n)-1]<<endl;
	 }
	return 0;
}
```cpp
2023/1/31 16:07
加载中...