题目

https://www.luogu.org/problemnew/show/P2831

思路

对于每只猪,我们先看看是否有前面的抛物线覆盖,有则不用管,没有则分两种情况讨论:

  1. 与前面没被覆盖的猪构成抛物线
  2. 暂时不管,最后统计答案时等于抛物线数+没有处理的点的个数

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const double eps=1e-8;
double abs(double x)
{
	return x>0?x:-x;
}
bool dy(double a,double b) 
{
	return abs(a-b)<eps; 
}
int n=0,m=0,ans=0;
double x[20],y[20],ax[20],bx[20],tx[20],ty[20];
void dfs(int c,int u,int v)
{
	if(u+v>=ans) return;
	if(c>n) 
	{
		ans=u+v; 
		return; 
	}
	bool bb=0;
	for(int i=1;i<=u;i++)
		if(dy(ax[i]*x[c]*x[c]+bx[i]*x[c],y[c]))
		{
			dfs(c+1,u,v); 
			bb=1; 
			break;
		}
	if(!bb) 
	{
		for(int i=1;i<=v;i++) 
		{
			if(dy(x[c],tx[i])) continue;
			double a=(y[c]*tx[i]-ty[i]*x[c])/(x[c]*x[c]*tx[i]-tx[i]*tx[i]*x[c]); 
			double b=(y[c]-x[c]*x[c]*a)/x[c]; 
			if(a<0) 
			{   
				ax[u+1]=a; 
				bx[u+1]=b;
				double q=tx[i],w=ty[i];
				for(int j=i;j<v;j++)
				{
					tx[j]=tx[j+1];
					ty[j]=ty[j+1];
				}
				dfs(c+1,u+1,v-1);
				for(int j=v;j>i;j--) 
				{
					tx[j]=tx[j-1];
					ty[j]=ty[j-1];
				}
				tx[i]=q;
				ty[i]=w;
			}
		}
		tx[v+1]=x[c];
		ty[v+1]=y[c];
		dfs(c+1,u,v+1); 
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
		ans=100;
		dfs(1,0,0);
		printf("%d\n",ans); 
	} 
	return 0;
}