Wa#5#8求调
查看原帖
Wa#5#8求调
941729
peiyinsong楼主2024/5/28 10:27
#include<bits/stdc++.h>
using namespace std;
int z[20],dp[1<<18];//单只猪的状态,dp数组;
double x[20],y[20];//猪的坐标
int xian[160];//枚举的抛物线;
pair<double,double> f(double x11,double x22,double y11,double y22){
	double a,b;
	a=(y11*x22-y22*x11)/((x11*x22)*(x11-x22));
	b=((y11*x22*x22)-(y22*x11*x11))/((x11*x22)*(x22-x11));
	return pair<double,double>(a,b);
}//求抛物线 
int main()
{
	//freopen("P2831_5.in","r",stdin);
	//freopen("l.out","w",stdout);
	int t;
	cin>>t;
	for(int i=1;i<=18;i++){
		z[i]=(1<<(i-1)); 
	}//初始化猪的状态
	 
	for(int u=1;u<=t;u++){
		int cnt=0;//抛物线数量 
		int n,m;
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			cin>>x[i]>>y[i];
		}
	
		for(int i=1;i<n;i++){
			for(int j=i+1;j<=n;j++){
				int s=0;//当前抛物线的状态 
				if(x[i]==x[j])continue;//不构成抛物线 
				pair<double,double>l=f(x[i],x[j],y[i],y[j]);
				double a,b;
				a=l.first;
				b=l.second;
				if(a<0){//特判反重力猪 
					for(int o=1;o<=n;o++){
					if(o==i){
					s|=z[i];
					continue;	
					}
					if(o==j){
					s|=z[j];
					continue;	
					}
					if(x[o]*x[o]*a+x[o]*b==y[o]){
						s|=z[o];
					}
				}
				xian[++cnt]=s;//更新抛物线的状态 
				}
			}
			xian[++cnt]=z[i];//只打一只猪的抛物线 
		}
		xian[++cnt]=z[n];//最后一只猪 
		for(int i=0;i<(1<<n);i++)dp[i]=1e9;
			dp[0]=0;//初始化 
			
			for(int i=0;i<(1<<n);i++){
				for(int j=1;j<=cnt;j++){
					int v=i|xian[j];
					dp[v]=min(dp[v],dp[i]+1); 
				}
			} 
			cout<<dp[(1<<n)-1]<<endl;
	}
return 0;
}

2024/5/28 10:27
加载中...