TLE/WA 70 求助
查看原帖
TLE/WA 70 求助
556362
qwq___qaq楼主2022/1/25 11:24

RT,目前已知 WA 是常数小了。

#include<bits/stdc++.h>
#define eps 1e-4
#define inf 0x3f3f3f3f
using namespace std;
int T,n,m,dp[1<<18],t;
double a[19],b[19];
inline int ask(int i,int j,int s){
	double a_1=a[i]*a[i],b_1=a[i],c_1=b[i];
	double a_2=a[j]*a[j],b_2=a[j],c_2=b[j];
	double true_a=(c_2*b_1-c_1*b_2)/(a_2*b_1-a_1*b_2),true_b=(c_2*a_1-c_1*a_2)/(b_2*a_1-b_1*a_2);
	if(true_a>=0||fabs(a[i]/b[i]-a[j]/b[j])<=eps){
		++t;
		return s|(1<<i-1);
	}
	int ans=s;
	for(int qwq=1;qwq<=n;++qwq)
		if(!(ans&(1<<qwq-1))&&fabs(true_a*a[qwq]*a[qwq]+true_b*a[qwq]-b[qwq])<=eps)
			ans|=(1<<qwq-1),++t;
	return ans;
}
inline int dfs(int s,int tot){
	if(tot==n)
		return 0;
	if(tot==n-1)
		return 1;
	if(dp[s]!=inf)
		return dp[s];
	for(int i=1;i<=n;++i)
		if(!(s&(1<<i-1)))
			for(int j=1;j<=n;++j)
				if(!(s&(1<<j-1))){
					t=tot;
					int it=ask(i,j,s);
					dp[s]=min(dp[s],dfs(it,t)+1);
					if(t==tot+1)
						dp[s]=min(dp[s],dfs(s|(1<<j-1),t)+1);
				}
	return dp[s];
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;++i)
			scanf("%lf%lf",&a[i],&b[i]);
		memset(dp,inf,sizeof(dp));
		printf("%d\n",dfs(0,0)); 
	}
	return 0;
}
2022/1/25 11:24
加载中...