csp-M4-B-ZJM要抵御宇宙射线

题目描述:

 

据传,2020年是宇宙射线集中爆发的一年,这和神秘的宇宙狗脱不了干系!但是瑞神和东东忙于正面对决宇宙狗,宇宙射线的抵御工作就落到了ZJM的身上。

假设宇宙射线的发射点位于一个平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的坐标都是整数。而ZJM要构造一个保护罩,这个保护罩是一个圆形 ,*中心位于一个宇宙射线的发射点上*。同时,因为大部分
经费都拨给了瑞神,所以ZJM要节省经费,做一个最小面积的保护罩。当ZJM决定好之后,东东来找ZJM一起对抗宇宙狗去了,所以ZJM把问题扔给了你~
输入描述
输入第一行一个正整数N,表示宇宙射线发射点的个数
接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置
输出描述
输出包括两行
第一行输出保护罩的中心坐标x,y用空格隔开
第二行输出保护罩半径的平方
(所有输出保留两位小数,如有多解,输出x较小的点,如还有多解,输入y较小的点)
无行末空格
样例输入

5
0 0
0 1
1 0
0 -1
-1 0
1
2
3
4
5
样例输出

0.00 0.00
1.00

解题思路:

暴力搜索,从所有点中找一个点,使得其到其余点的最大距离最短即可!

注意

1)数据范围:距离平方会超出int,所以dis用 long long 存储

2)多解输出 x较小,y较小的点(节点关键字排序)

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm> 
 5 using namespace std;
 6 typedef long long ll;
 7 int N;  //
 8 //求最小覆盖半径和中心点坐标 
 9 struct node{
10     int x;
11     int y;
12 };
13 bool cmp(node n1,node n2){
14     if(n1.x!=n2.x) return n1.x<n2.x;
15     else return n1.y<n2.y;
16 }
17 node p[1001]; 
18 ll dis[1001][1001];
19 ll maxd[1001]; 
20 int index;
21 int main(){
22     cin>>N;
23     //找一点到所有其他所有点最大距离最小 
24     for(int i=1;i<=N;i++){
25         cin>>p[i].x>>p[i].y;
26 //        for(int j=1;j<i;j++){
27 //            dis[i][j]= pow((p[i].x-p[j].x),2)+pow((p[i].y-p[j].y),2);
28 //            dis[j][i]=dis[i][j] ;
29 //            //cout<<"dis["<<i<<"]["<<j<<"] :"<<dis[i][j]<<endl; 
30 //        }        
31     }
32     sort(p+1,p+N+1,cmp);
33 //    for(int i=1;i<=N;i++) cout<<p[i].x<<" "<<p[i].y<<endl;
34     
35     for(int i=1;i<=N;i++){
36         for(int j=1;j<i;j++){
37             dis[i][j]= pow((p[i].x-p[j].x),2)+pow((p[i].y-p[j].y),2);
38             dis[j][i]=dis[i][j] ;
39             //cout<<"dis["<<i<<"]["<<j<<"] :"<<dis[i][j]<<endl; 
40         }        
41     }
42     for(int i=1;i<=N;i++) dis[i][i]=0;    
43     //maxd[i] means maxdis for i to each points
44     long long  maxdis=999999999999;
45     for(int i=1;i<=N;i++){
46         maxd[i]=0;
47         for(int j=1;j<=N;j++){
48             if(maxd[i] < dis[i][j])
49             maxd[i]=dis[i][j];
50         }
51         //cout<<"maxd["<<i<<"]:  "<<maxd[i]<<endl;
52         if(maxd[i]<maxdis){
53             maxdis=maxd[i];
54             index =i;
55         }
56         //cout<<"index:"<<index<<endl;
57         //cout<<maxdis<<endl;                            
58     }
59     printf("%lld.00 %lld.00\n%lld.00\n",p[index].x,p[index].y,maxdis);
60 //    printf("%.2f %.2f\n",double(p[index].x),double(p[index].y));
61 //    printf("%.2f\n",double(maxdis));
62 //    for(int i=1;i<=N;i++){
63 //        
64 //    }
65     
66     
67     return 0;
68 } 

 

posted @ 2020-06-05 12:28  流转~星云  阅读(197)  评论(0编辑  收藏  举报