题目给出一些点的坐标(横坐标,纵坐标),没有重叠的点,求是否存在一条竖线(平行于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; }
时间: 2024-10-13 19:32:14