题目链接:点击打开链接
感觉是在考基础,最开始一直在想有什么好的算法,结果也还是退回到枚举的思路上来了;
枚举每一对顶点,如果距离大于2,则抛弃,否则,求出到这两点距离为1的圆心坐标,遍历所有点到这个圆心的距离,统计ans
得到ans最大值即为问题的解
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<vector>
#include<iomanip>
#include<queue>
using namespace std;
struct Node{
float x;
float y;
Node(){}
Node(float _x,float _y):x(_x),y(_y){}
};
inline float getDist(const Node& a,const Node& b){
double t=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return sqrt(t);
}
int getAns(const vector<Node>& nodes,const Node& node1,const Node& node2){
Node tt((node1.x+node2.x)*1.0/2,(node1.y+node2.y)*1.0/2);
float dy=node2.y-node1.y;
float dx=node2.x-node1.x;
Node center;
float r=sqrt(1.0-getDist(node1,tt)*getDist(node1,tt));
if(abs(float(dx))<1e-6){//dx==0
center.x=node1.x;
center.y=tt.y-r;
}else{
double ang=atan(dy/dx);
center.x=tt.x+r*sin(ang);
center.y=tt.y-r*cos(ang);
}
int ans=0;
for(size_t i=0;i<nodes.size();++i){
if(getDist(nodes[i],center)<=1.0001){
ans++;
}
}
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T,N;
cin>>T;
while(T--){
cin>>N;
vector<Node> nodes;
while(N--){
Node node;
cin>>node.x>>node.y;
nodes.push_back(node);
}
int ans=1;
for(size_t i=0;i<nodes.size();++i){
for(size_t j=i+1;j<nodes.size();++j){
float dis=getDist(nodes[i],nodes[j]);
if(dis>=2.0) continue;
int hh=getAns(nodes,nodes[i],nodes[j]);
if(ans<hh){
ans=hh;
}
}
}
cout<<ans<<endl;
}
return 0;
}