记录编号 419827 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016]愤怒的小鸟 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 2.158 s
提交时间 2017-07-03 15:27:05 内存使用 4.32 MiB
显示代码纯文本
#include<bits/stdc++.h>

using namespace std;

int T,n,m,f[1<<20],b[20][20],xian[450],cnt;
double a[20][2],p,q;

int main()
{
	freopen("angrybirds.in","r",stdin);
	freopen("angrybirds.out","w",stdout);
//	freopen("1.txt","r",stdin);
	scanf("%d",&T);
	while(T--)
	{
		cnt=0;
		memset(b,0,sizeof(0));
		memset(a,0,sizeof(0));
		memset(xian,0,sizeof(xian));
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		scanf("%lf%lf",&a[i][0],&a[i][1]);
		for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
		{
			if(abs(a[i][0]-a[j][0])<1e-6)continue;//判断两头猪在同一条竖线上 
			if((a[i][1]/a[i][0]-a[j][1]/a[j][0])/(a[i][0]-a[j][0])>=-1e-6)//A斜率比B大,横坐标也比B靠后,那么他们构成不了抛物线 
			continue;
			q=(a[i][1]*a[j][0]-a[i][0]*a[j][1])/(a[i][0]*a[i][0]*a[j][0]-a[j][0]*a[j][0]*a[i][0]);
			p=(a[i][1]*a[j][0]*a[j][0]-a[j][1]*a[i][0]*a[i][0])/(a[i][0]*a[j][0]*a[j][0]-a[i][0]*a[i][0]*a[j][0]);
			xian[++cnt]|=1<<(i-1);
			xian[cnt]|=1<<(j-1);
			for(int k=1;k<=n;k++)
			{
				double g=q*a[k][0]+p;
				if(abs(g-a[k][1]/a[k][0])<1e-7)//神奇的卡精度蒟蒻表示只能照搬 
				xian[cnt]|=1<<(k-1);
			}
		}/*
		for(int i=1;i<=n;i++)
		{
			for(int j=i;j<=n;j++)
				cout<<b[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
		int t=(1<<n)-1;
		memset(f,20,sizeof(f));
		f[0]=0;
		for(int i=1;i<=n;i++)
		xian[++cnt]|=1<<(i-1);
		for(int i=0;i<=t;i++)//这里从0开始,因为所有状态都是由0转移来的 
		{
			for(int k=1;k<=cnt;k++)
			{
				f[xian[k]|i]=min(f[i|xian[k]],f[i]+1);//每一个xian【i】存的都是一条线打掉的猪的状态 
			}
		}
//		for(int i=1;i<=t;i++)
//		cout<<f[i]<<" ";
//		cout<<endl;
		cout<<f[t]<<endl;
	}
	return 0;
}