题目
https://www.luogu.org/problemnew/show/P2831
思路
对于每只猪,我们先看看是否有前面的抛物线覆盖,有则不用管,没有则分两种情况讨论:
- 与前面没被覆盖的猪构成抛物线
- 暂时不管,最后统计答案时等于抛物线数+没有处理的点的个数
代码
#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;
}