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;
}
时间: 2024-08-03 00:17:02

Uva 3226 Symmetry的相关文章

uva 1595 - Symmetry

思路:首先,如果这些点对称,那么它们的对称轴是x = m(m是所有点横坐标的平均值):   把这些点放到一个集合里,然后扫描每个点,计算出它关于x = m的对称点,看这个点是否在集合里面.   如果有一个不在的话,说明不能构成对称图形. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <set> 5 using namespace std; 6 7 str

uva 1595 Symmetry 暴力

还是暴力 只需要判断是否关于竖直线堆成 写两个数组 一个按照先x升序后y降序排 一个按照先x降序后y降序排 然后从0扫到(n/2+1)就好 判x之和是否相等和y坐标是否相等即可 弱校连萌题目链接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=5772#problem/N #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream&

UVa 1595 (水题) Symmetry

颓废的一个下午,一直在切水题,(ˉ▽ ̄-) 首先如果这些点是对称的话,那么它们的对称轴就是x = m,m是横坐标的平均值. 把这些点放到一个集合里,然后扫描每个点,计算出它关于x = m的对称点,看这个点是否在集合里面. 如果有一个不在的话,说明不能构成对称图形. 1 #include <cstdio> 2 #include <algorithm> 3 #include <set> 4 using namespace std; 5 6 struct Point 7 {

UVA 10585 Center of symmetry

题意:给出一个点集,问这个集合有没有中心点使点集对称,这个点可以是点集中的点也可以不是点集的点. 解法:一开始我枚举每两个点连线的中点……结果T了orz当时也不知道怎么想的…… 将点按横坐标排序,如果点集有中心点则中心点一定是排序后排在中间的那个点(n为奇数)或者中间两个点的连线中点(n为偶数),然后判断一下是不是中心点即可. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<

UVa第五章STL应用 习题((解题报告))详细!

例题5--9 数据库 Database UVa 1592 <strong><span style="font-size:18px;"><span style="font-size:18px;"><strong><span style="font-size:18px;">#include<iostream> #include<string> #include<

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED