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\n" );

		} else {

			printf( "NO\n" );

		}

	}

	return 0;

}

 

你可能感兴趣的:(try)