比赛 csp2025模拟练习2 评测结果 RRMRRMRRMRMRMMRMMMMM
题目名称 愤怒的小鸟 最终得分 0
用户昵称 李奇文 运行时间 2.805 s
代码语言 C++ 内存使用 1.95 MiB
提交时间 2025-10-29 11:55:56
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const double E=1e-8;
struct P{ double x,y; };
int n,m,ans;
vector<P> p;
vector<vector<int>>l;
bool s(double x,double y){
	return fabs(x-y)<E;
}
bool o(int i,int j,int k){
	double x1=p[i].x,y1=p[i].y,x2=p[j].x,y2=p[j].y,x3=p[k].x,y3=p[k].y;
	if(s(x1,x2))  return 0;
	double A=(x2*y1-x1*y2)/(x1*x1*x2-x2*x2*x1);
	double B=(x1*x1*y2-x2*x2*y1)/(x1*x1*x2-x2*x2*x1);
	if(A>=0) return 0;
	return s(A*x3*x3+B*x3,y3);
}
void dfs(int i,int u,int c){
	if(u>=ans) return;
	if(c==(1<<n)-1){
		ans=min(ans,u);
		return;
	}
	if(i==l.size()) return;
	if((c|l[i])!=c) dfs(i+1,u+1,c|l[i]);
	dfs(i+1,u,c);
}
int main(){
	freopen("angrybirds.in","r",stdin);
	freopen("angrybirds.out","w",stdout);
	int T;
	cin>>T;
	while(T--){
		cin>>n>>m;
		p.resize(n);
		for(int i=0;i<n;i++) cin>>p[i].x>>p[i].y;
		l.clear();
		for(int i=0;i<n;i++){
			vector<int>t={i};
			l.push_back(t);
			for(int j=i+1;j<n;j++){
				if(s(p[i].x,p[j].x)) continue;
				double x1=p[i].x,y1=p[i].y,x2=p[j].x,y2=p[j].y;
				double A=(x2*y1-x1*y2)/(x1*x1*x2-x2*x2*x1);
				double B=(x1*x1*y2-x2*x2*y1)/(x1*x1*x2-x2*x2*x1);
				if(A>=0) continue;
				vector<int>t2={i,j};
				for(int k=0;k<n;k++){
					if(k==i||k==j) continue;
					if(o(i,j,k)) t2.push_back(k);
				}
				l.push_back(t2);
			}
		}	
		sort(l.begin(),l.end(),[](auto x,auto y){return x.size()>y.size();});
		ans=n;
		dfs(0,0,0);
		cout<<ans<<endl;
	}
	return 0;
}