比赛 csp2025模拟练习2 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 愤怒的小鸟 最终得分 100
用户昵称 健康铀 运行时间 1.235 s
代码语言 C++ 内存使用 5.76 MiB
提交时间 2025-10-29 10:38:49
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int t,n,m,f[1<<19],h[400],top,ans;
double x[20],y[20],e=1e-8;
int main(){
	freopen("angrybirds.in","r",stdin);
	freopen("angrybirds.out","w",stdout);
	cin>>t;
	while(t--){
		cin>>n>>m;
		if(n==0){
			cout<<0<<endl;
			continue;
		}
		top=0,ans=INT_MAX;
		for(int i=1;i<=n;i++){
			cin>>x[i]>>y[i];
			h[++top]=(1<<(i-1));
		}
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				double am=(x[i]-x[j])*x[i]*x[j];
				if(abs(am)<e)
				continue;
				double a=(y[i]*x[j]-y[j]*x[i])/am;
				double b=(y[i]*(x[j]*x[j])-y[j]*(x[i]*x[i]))/(x[i]*x[j]*(x[j]-x[i]));
				if(a>=-e)
				continue;
				h[++top]=(1<<(i-1));
				h[top]|=(1<<(j-1));
				for(int k=1;k<=n;k++){
					if(k==i||k==j)
					continue;
					if(abs(a*(x[k]*x[k])+b*x[k]-y[k])<e){
						h[top]|=(1<<(k-1));
					}
				}
			}
		}
		sort(h + 1, h + top + 1);
		top = unique(h + 1, h + top + 1) - (h + 1);
		memset(f,0x3f,sizeof(f));
        f[0]=0;
		for(int i=0;i<(1<<n);i++){
			for(int k=1;k<=top;k++){
				if(f[i]>1e8)
				continue;
				f[i|h[k]]=min(f[i|h[k]],f[i]+1);
			}
		}
			ans=min(ans,f[(1<<n)-1]);
		cout<<ans<<endl;
	}
	return 0;
}