• 【水】JSOI完美的对称


    完美的对称

    题目描述

    在峰会期间,必须使用许多保镖保卫北约组织的各国代表。代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们。为了使他们的工作卓有成效,使被保卫的人的安全尽可能得到保障,保镖被分配到被保护人的各个方向。

     

    保镖的最佳站立位置应该是这样的:被保护人应站在所有保镖的对称中心。但是,只要被保护人一移动,保镖就很难根据要人的新位置调整位置。大多数的特工都很难对此作出实时调整。

    因此,内政部长高斯决定将该过程逆转一下,保镖先站好自己的位置,然后要人在他们的对称中心找到合适的位置。如果要人随便走动,我们就对他的安全不必负责。

    你的工作是使这个过程自动操作。给出一组N个点(保镖的位置),你要找出它们的对称中心S,在这儿被保护人将相对安全。下面以此类推。

    首先我们给定一点A以及对称中心S,点A'是点A以S为对称中心形成的像点,即点S是线段AA'的对称中心。

    点阵组(X)以S为中心的像点是由每个点的像点组成的点阵组。X是用来产生对称中心S的,即点阵X以S为中心的像点的集合即为点阵X本身。

     

    输入

    输入文件第一行是一个整数N,1<=N<=20000,接下来的N行每行包含用空格隔开的两个整数Xi和Yi,-100000<=Xi,Yi<=100000,表示这组点阵中第I个点的笛卡尔坐标值。

    因为任何两个保镖都不会站在同一个位置上,所以在给定的作业中,任何两点都不相同。但注意保镖可以站在被保护人相同的位置。

     

    输出

    输出文件仅有一行。如果给定的点阵能产生一个对称中心,则输出“V.I.P  should  stay  at (x,y)”,其中X和Y代表中心的笛卡尔坐标值,格式为四舍五入保留至小数点后一位。如果该组点阵无对称中心,输出"This is a dangerous situation.",注意输出时除了两个单词之间用一个空格隔开外,不要输出多余空格。

     

    样例

    SYMMETRY.IN

    8

    1 10

    3 6

    6 8

    6 2

    3 -4

    1 0

    -2 -2

    -2 4

     

    SYMMETRY.OUT

    V.I.P. should stay at (2.0,3.0).

    思路

    随意YY一个顺序将读入的数据按x,y为第一第二关键字排个序,然后把第一个和最后一个的中点作为基准,其他点对中点如果有不等的输出dangerous否则输出基准

    sort调了好久,不重载运算符也可以用cmp过(或者说我写不对重载运算符囧)

    代码

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,i,j,tail;
    struct note
    {
        int x,y;
    };
    note s[200005];
    int ps[500];
    
    bool cmp(const note a,const note b) 
    {
        if (a.x>b.x) return true;
        if (a.x<b.x) return false;
        if (a.y>b.y) return true;
        if (a.y<b.y) return false;
        return true;
    }
    
    int main()
    {
        freopen("symmetry.in","r",stdin);
        freopen("symmetry.out","w",stdout);
        cin>>n;
        bool pd=true;
        for (i=1;i<=n;i++) {cin>>s[i].x>>s[i].y;}
        sort(s+1,s+n+1,cmp);
        double tx=( (double)(s[1].x+s[n].x)/2);
        double ty=( (double)(s[1].y+s[n].y)/2);
        bool flag=true;
        for (i=1;i<=(n>>1)+1;i++)
        {
            if ((double)((s[i].x+s[n-i+1].x)) != (tx*2) ) {flag=false;break;}
            if ((double)((s[i].y+s[n-i+1].y)) != (ty*2) ) {flag=false;break;}
        }
        if (flag==true) printf("V.I.P. should stay at (%.1lf,%.1lf).",tx,ty); 
            else cout<<"This is a dangerous situation!"<<endl; 
        system("pause");
        return 0;
    }

    结果

  • 相关阅读:
    GenericServlet和HttpServlet有什么区别?
    什么是RMI?
    【WPF学习】第十八章 多点触控输入
    【WPF学习】第十七章 鼠标输入
    【WPF学习】第十六章 键盘输入
    【WPF学习】第十五章 WPF事件
    【WPF学习】第十四章 事件路由
    【WPF学习】第十三章 理解路由事件
    【WPF学习】第十二章 属性验证
    【WPF学习】第十一章 理解依赖项属性
  • 原文地址:https://www.cnblogs.com/seekdreamer/p/4002396.html
Copyright © 2020-2023  润新知