• 洛谷P1227 完美的对称


    传送门

    题目描述

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

    保镖的最佳站立位置应该是这样的:被保护人应站在所有保镖的对称中心。但是,只要被保

    护人一移动,保镖就很难根据要人的新位置调整位置。大多数的特工都很难对此作出实时调整。

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

    你的工作是使这个过程自动操作。给出一组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!",注意输出时除了两个单词之间用一个空格隔开外,不要输出多余空格。

    输入输出样例
    输入 #1复制
    8
    1 10
    3 6
    6 8
    6 2
    3 -4
    1 0
    -2 -2
    -2 4
    输出 #1复制
    V.I.P. should stay at (2.0,3.0).

    说明/提示

    [JSOI2008]第二轮

    上代码:

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    int n;
    struct node {
    	int x, y; 
    } a[20200];
    
    int cmp(node p,node q) { // 普通的结构体排序的cmp函数,当然在结构体里写重载运算符也珂以。
    	if(p.y == q.y) return p.x < q.x; // 也要判断y坐标相等的情况。
    	return p.y < q.y;
    } 
    
    inline int read() { //快读,没啥话好说。
    	register int x = 0, f = 1;
    	char ch = getchar();
    	while (!isdigit(ch)) {
    		if (ch == '-') f = -1;
    		ch = getchar();
    	}
    	while (isdigit(ch)) {
    		x = x * 10 + ch - '0';
    		ch = getchar();
    	}
    	return x * f;
    } 
    
    void init() { // 为了使主函数看起来更简便,则把主函数中的代码放到一个单独的函数里,方便检查。
    	int i, j;
    	double tx, ty, px, py;
    	cin >> n; 
    	for(i = 1; i <= n; i++) 
    		cin >> a[i].x >> a[i].y;
    	sort(a + 1, a + n + 1, cmp);// 对结构体进行y坐标排序。
    	tx=(a[1].x + a[n].x + (0.0))/2;
    	ty=(a[1].y + a[n].y + (0.0))/2; //注意整数除以2不一定是整数,int转double要和0.0一起操作。
    	for(i = 1,j = n;i <= j; i++,j--) { //类似于two-pointers.
    		px = (a[i].x + a[j].x + (0.0))/2;
    		py = (a[i].y + a[j].y + (0.0))/2;
    		if(px != tx || py != ty) {
    			printf("This is a dangerous situation!\n"); //此时已出现矛盾。
    			return;
    		}
    	}
    	cout<<"V.I.P. should stay at ("<<fixed<<setprecision(1)<<tx<<","<<fixed<<setprecision(1)<<ty<<")."<<endl; //没有出现矛盾,根据题目要求输出即可。
    }
    
    int main() {
    	init();//在主函数里调用。
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    java封装和四种权限修饰符
    Ribbon饥饿加载
    读书笔记-《ON JAVA 中文版》-摘要2
    金蝶系统组织架构封存sql使用
    探索随机森林: 机器学习中的集成学习神器
    Redis 配置文件说明
    球场输了?卡塔尔背地里可能赢麻了!
    Cairo介绍及源码构建安装(2)
    Redis:报错Creating Server TCP listening socket *:6379: bind: No error
    Idea操作Git合并另一个分支的部分提交
  • 原文地址:https://blog.csdn.net/lzx_xzl_______/article/details/126190132