Uva 3226 Symmetry

题目给出一些点的坐标(横坐标,纵坐标),没有重叠的点,求是否存在一条竖线(平行于y轴的线),使线两边的点左右对称。

我的思路:对于相同的纵坐标的点,即y值相同的点,可以将x的总和计算出,然后除以点的数目,即可得到对称轴的x坐标。所以,对于不同的y值,可以算出这个y值对应的点的对称轴的x坐标,只要观察这些x坐标的值是否相等即可。如果相同,则存在一条竖线满足题意。如果出现不相同,则不存在符合题意的竖线。

注意点:计算后的x的值可能为小数,故需要用double保存。

/*
	UvaOJ 1595
	Emerald
	Mon 4 May 2015
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>

using namespace std;

int main() {
	int T;
	cin >> T;
	while( T -- ) {
		int N;
		cin >> N;
		map < int,int > yToXsum; // key : the value of y, value : the total value of x in y axis
		map < int,int > yTimes; // key : the value of y, value : the times that y appears
		map < int, int >::iterator it;
		int x, y;
		while( N -- ) {
			scanf( "%d%d", &x, &y );
			if( yToXsum.count( y ) ) {
				yToXsum[y] += x;
			} else {
				yToXsum[y] = x;
			}
			if( yTimes.count( y ) ) {
				yTimes[ y ] ++;
			} else {
				yTimes[ y ] = 1;
			}
		}
		double ave; // the average of the x
		it = yTimes.begin();
		ave = 1.0 * yToXsum [ it->first ] / it->second;
		for( it ++; it!=yTimes.end(); it ++ ) {
			if( ave != 1.0 * yToXsum [ it->first ] / it->second ) {
				break;
			}
		}
		if( it == yTimes.end() ) {
			printf( "YES
" );
		} else {
			printf( "NO
" );
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Emerald/p/4480722.html