• 算法与数据结构实验题 5.2 Missile


    1、题目:

    2、解题思路:

    把每个点对应的两条半径求出,之后对d1进行升序排序,对应d2也改变位置。其中一个圆心的半径r1确定之后,除去第一个圆包围的点,在其余点中找到另外一个圆的最长的半径r2,此时r1+r2就是所求的包围所有点的半径之和,与最小值进行比较即可。要注意的是r1的半径可能是0,这种情况要另外考虑。

    3、代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct Node
    {
    	int d1;
    	int d2;
    } node[100001];
    
    int cmp(Node n1, Node n2)
    {
    	return n1.d1 < n2.d1;
    }
    
    int main()
    {
    	int x1,x2,y1,y2;
    	int n,i,x,y;
    	cin>>x1>>y1>>x2>>y2;
    	cin>>n;
    	for(i=0; i<n; i++)
    	{
    		cin>>x>>y;
    		node[i].d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);
    		node[i].d2=(x-x2)*(x-x2)+(y-y2)*(y-y2);
    	}
    	sort(node,node+n,cmp);//对d1升序排序 
    	int r1=0,r2=0,ans=-1;
    	for(i=n; i>0; i--)
    	{
    		r1= node[i-1].d1;
    		if(i<n)
    			if(node[i].d2>r2)
    			{
    				r2=node[i].d2;
    			}
    		if(ans>(r1+r2)||ans<0)
    		{
    			ans=r1+r2;
    		}
    	}
        //r1=0时
    	if(node[0].d2>r2)
    	{
    		r2=node[0].d2;
    	}
    	if(ans>r2||ans<0)
    	{
    		ans=r2;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
  • 相关阅读:
    预编译对象四部区
    闭包
    使用charCodeAt计算字节数
    对象增删改查
    nacos
    Maven不能不关注啦
    jvm造轮子
    ubuntu 20.0 安装 mongodb
    ubuntu 安装 mongodb
    腾讯云服务器如何使用root账号登录,不能使用root登录怎么办
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/5939512.html
Copyright © 2020-2023  润新知