hdu1077 Catching Fish

题目链接:点击打开链接

感觉是在考基础,最开始一直在想有什么好的算法,结果也还是退回到枚举的思路上来了;

枚举每一对顶点,如果距离大于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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值