求助P2831
  • 板块学术版
  • 楼主naturelyf
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/11 20:14
  • 上次更新2024/11/11 22:38:42
查看原帖
求助P2831
476473
naturelyf楼主2024/11/11 20:14
#include<bits/stdc++.h>
#define db double
#define PDD pair<db,db>
#define x first
#define y second
using namespace std;
const db eps=1e-8;
const int N=20;
bool pd(db a,db b){
	return fabs(a-b)<eps;
}
int n,m,ans;
db x[N],y[N];
PDD pwx[N],rs[N];
void init(){
	ans=1e9;
	for(int i=1;i<=20;i++)
		x[i]=y[i]=pwx[i].x=pwx[i].y=rs[i].x=rs[i].y=0;
}
void dfs(int c,int v,int sum){
	if(sum+v>=ans)return;
	if(c>n){
		ans=min(ans,v+sum);
		return;
	}
	for(int i=1;i<=sum;i++){
		if(pd(pwx[i].x*x[c]*x[c]+pwx[i].y*x[c],y[c])){
			dfs(c+1,v,sum);
			return;
		}
	}//不用新增抛物线 
	for(int i=1;i<=v;i++){
		if(pd(rs[i].x,x[c]))continue;
		db a=(y[c]*rs[i].x-rs[i].y*x[c])/(x[c]*x[c]*rs[i].x-rs[i].x*rs[i].x*x[c]); 
		db b=(y[c]-x[c]*x[c]*a)/x[c];
		if(a<0){
			pwx[sum+1]=make_pair(a,b);
			db xx=rs[i].x,yy=rs[i].y;
			for(int j=i;j<v;j++)rs[j]=rs[j+1];
			dfs(c+1,v-1,sum+1);
			for(int j=v;j>i;j--)rs[j]=rs[j-1];
			rs[i]=make_pair(xx,yy);
		}
		
	}//和原来一个一起新增一条
	rs[v+1]=make_pair(x[c],y[c]);
	dfs(c+1,v+1,sum);//不被覆盖 
}//c:当前看到前c个点
//v:有v个点没被抛物线覆盖
//sum:抛物线数量 
void solve(){
	init();
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
	}
	dfs(1,0,0);
	printf("%d\n",ans);
}
int main(){
//	freopen("1.out","w",stdout);
	int T;
	cin>>T;
	while(T--)solve();
//	printf("1\n1\n2\n1\n1\n1\n1\n2\n1\n2\n");
	return 0;
}

思路是爆搜,第一二个测试点下载本地能过,交上去一分没有

2024/11/11 20:14
加载中...