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 struct Point{
 8     int x, y;
 9     Point(int x = 0, int y = 0):x(x), y(y){}
10     bool operator < (const Point & rhs) const
11     {
12         return x < rhs.x || (x == rhs.x && y < rhs.y);
13     }
14 };
15
16 const int maxn = 1000 + 10;
17 Point p[maxn];
18
19 int main()
20 {
21     int T, n;
22     set<Point> sP;
23     scanf("%d", &T);
24     while(T--)
25     {
26         double s = 0, m;
27         sP.clear();
28         scanf("%d", &n);
29         for(int i = 0; i < n; i++)
30         {
31             cin >> p[i].x >> p[i].y;
32             sP.insert(p[i]);
33             s += p[i].x;
34         }
35         m = s / n;    // m: must to be a integer.
36         bool ok = true;
37         for(int i = 0; i < n; i++)
38         {
39             Point t((int)(m*2)-p[i].x, p[i].y);
40             if(!sP.count(t))
41             {
42                 ok = false;
43                 break;
44             }
45         }
46         printf("%s\n", ok ? "YES" : "NO");
47     }
48     return 0;
49 }
时间: 2024-10-08 22:20:20

uva 1595 - Symmetry的相关文章

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 3226 Symmetry

题目给出一些点的坐标(横坐标,纵坐标),没有重叠的点,求是否存在一条竖线(平行于y轴的线),使线两边的点左右对称. 我的思路:对于相同的纵坐标的点,即y值相同的点,可以将x的总和计算出,然后除以点的数目,即可得到对称轴的x坐标.所以,对于不同的y值,可以算出这个y值对应的点的对称轴的x坐标,只要观察这些x坐标的值是否相等即可.如果相同,则存在一条竖线满足题意.如果出现不相同,则不存在符合题意的竖线. 注意点:计算后的x的值可能为小数,故需要用double保存. /* UvaOJ 1595 Eme

uva 1595

一道关于stl map的习题,并不是很复杂. 关于是否对称,我是先把所有坐标y值一样的存起来,用vector保存相应x的值. 然后遍历整个map,对于每一组y坐标一样的点,对其x值进行排序. 将x的最大值和最小值相加作为竖线的x值(的2倍),看看这条直线是否满足要求即可. #include <iostream> #include <cstdio> #include <vector> #include <map> #include <algorithm&

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<

第五章-習題(1-11)待續

5-1 代碼對齊(UVa 1593) 不難,按行讀取,然後stringstream輸入到vector<string>那裏去,算出行最大單詞數,再算出列單詞最大寬度,然後就可以格式化輸出了: #include<iostream> #include<string> #include<algorithm> #include<vector> #include<cstdio> #include<sstream> using name

Uva1595 对称轴

Uva 1595对称轴 题目描述: 给出平面上N个点,问是否可以找到一条竖线,使得所有点左右对称. 思路: 这个题我的思路是将所有高度(y)相同的点求每组高度的坐标x的平均值,如果总个数N是偶数,那么只要每组高度的x平均值相同,就能找到一个对称轴,而N是奇数,则需要平均值相同的基础上找出所有点的坐标x的中位数,如果中位数和平均值相同,那么也可以. 做的时候想的条件有些复杂,多加了一些没用的判断.这里提供两组测试数据,供参考. 2 4 -1 0 1 0 0 0 0 -1 5 0 -1 0 1000

UVA 10585 Center of symmetry

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