[JSOI2008]完美的对称

https://www.luogu.org/problem/show?pid=1227

 

对着图片观察了一会,会发现中间点必是最远点的一半。 自己可以画个图片 思考思考。

那么就排序,算出一对最远点x,y加和的一半 之后对每对点判断?

但是如果是奇数个点呢? 那么判断一下 最后一个单独点如果不是中间点 就可以了。

 

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 struct point{
 5     int x,y;
 6 }a[20005];
 7 int n;
 8 bool CMP(point a,point b){
 9     if(a.x!=b.x) return a.x<b.x;
10     if(a.y!=b.y) return a.y<b.y;
11     return 0;
12 }
13 int main(){
14     scanf("%d",&n);
15     for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
16     sort(a+1,a+1+n,CMP);
17     double first = (a[1].x+a[n].x)/2.0;
18     double second = (a[1].y+a[n].y)/2.0;
19     for(int i=2;i<=(n/2)+1;i++){
20         if( (a[i].x+a[n-i+1].x)/2.0 != first || (a[i].y+a[n-i+1].y)/2.0 != second){
21             printf("This is a dangerous situation!\n");
22             return 0;
23         }
24     }
25     printf("V.I.P. should stay at (%.1f,%.1f).",first,second);
26     return 0;
27 }
代码实现

 

转载于:https://www.cnblogs.com/OIerLYF/p/6901558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值