Uva 1595对称轴

题目描述:

给出平面上N个点,问是否可以找到一条竖线,使得所有点左右对称。

思路:

这个题我的思路是将所有高度(y)相同的点求每组高度的坐标x的平均值,如果总个数N是偶数,那么只要每组高度的x平均值相同,就能找到一个对称轴,而N是奇数,则需要平均值相同的基础上找出所有点的坐标x的中位数,如果中位数和平均值相同,那么也可以。

做的时候想的条件有些复杂,多加了一些没用的判断。这里提供两组测试数据,供参考。

2
4
-1 0
1 0
0 0
0 -1
5
0 -1
0 10000
0 -10000
0 2
0 5
代码:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{int T;//freopen("uva1595_in.txt", "r", stdin);//freopen("uva1595_out.txt", "w", stdout);cin >> T;while(T--){int n, N;cin >> n; N = n;int x, y;map<int, long long> height;map<int, float> hnums;vector<int> xvec;while(n--){cin >> x >> y;xvec.push_back(x);if(!height.count(y)) height[y] = x;else height[y] += x;if(!hnums.count(y)) hnums[y] = 1;else hnums[y] = hnums[y] + 1.0;}vector<float> means;int failed = 0;for(auto it = height.begin(); it != height.end(); ++it){float avrg = (*it).second / hnums[(*it).first];means.push_back(avrg);}for(int i = 0; i < means.size()-1; ++i){if( means[i] != means[i+1]){failed = 1;break;} }       float avgr = means[0];if(!failed && N%2){sort(xvec.begin(), xvec.end());int mid = xvec[N/2];if(mid*2 != (int)(avgr*2)) failed = 1;  }int i;for(i = 0; i < xvec.size()-1; ++i){if(xvec[i] != xvec[i+1]) break;}if(i == xvec.size()-1) failed = 0; if(!failed) cout << "YES\n";else cout << "NO\n";}
}
PS:

此外我还在网上看到两种方法,要比我上面的这个简单不少。

一是先找到x最大和最小的两个点,取他们的中点作为对称轴,因为如果整个图形对称,那么对称轴一定在最外面的两个点的中点上。然后对每个点遍历,看是否存在与之对称的点。

参看链接:https://blog.csdn.net/GuoZLH/article/details/53141335

二是直接对所有点按x大小分别升序和降序地排列一次,然后顺序地看point1[i].x + point2[i].x是否是中轴的二倍,然后再看y是否相同即可。中轴和方法一的做法一致。这个方法应该是最巧妙的。

参看链接:https://blog.csdn.net/Amateur_DP/article/details/81255412

转载于:https://www.cnblogs.com/patrolli/p/11291723.html

Uva1595 对称轴相关推荐

  1. UVA1595(对称轴)

    作者:xq的acm之路. 题目描述:给出平面上N(N<=1000)个点.问是否可以找到一条竖线,使得所有点左右对称. 思路:求出左右两边的最远的点,求出对称轴,然后枚举各个点就能ac. 代码如下 ...

  2. 22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-1595 思路: 此题本质是一道笛卡尔坐标系上的对称性问题. 判定性问题:由于只要能判别图像是否左右对称即可,无需确认关于哪条垂直线对称,那 ...

  3. 习题5-6 对称轴 UVa1595

    1.题目描述:点击打开链接 2.解题思路:判断是否对称只需要看x坐标,因此可以先将每个y值分配一个ID:先判断是否自对称,如果都是,进一步判断所有自对称的对称轴是否都相同,注意用对称轴坐标的二倍来判断 ...

  4. LeetCode 360. 有序转化数组(抛物线对称轴)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个已经 排好序 的整数数组 nums 和整数 a.b.c.对于数组中的每一个数 x,计算函数值 f(x) = ax^2 + bx + c,请将函数值 ...

  5. OpenCV--直线拟合fitLine及求两直线对称轴

    文章目录 直线拟合fitLine 求两直线对称轴 倾斜校正 附1 实验代码 直线拟合fitLine void cv::fitLine( cv::InputArray points, // 二维点的数组 ...

  6. 轴对中工具app android,对称轴软件绘画图案app下载安装-对称轴软件绘画appV1.0手机版下载_飞翔下载...

    对称轴绘画软件安卓版app已经上线了,你只要画出对称图案的一部分,软件就可以自动帮你填充接下来一模一样的图案,画图更加的省心,如果你也想用对称轴软件绘画图案的话,那就快来下载此款软件体验一下试试吧 功 ...

  7. 对称轴(Symmetry)

    给出平面上N(N≤1000)个点,问是否可以找到一条竖线,使得所有点左右对称. /*对称轴一定是最左边和最右边点的中点所在竖线. 可以找最左边和最右边的点,即横坐标最小和最大. 主要是把点的横坐标排序 ...

  8. C++:给定一个二维点集,找到所有的整体对称轴

    这里我列出了两种方法: 1.基于质心的解法.(这种方法要求除非你拥有"分数"的数据结构,不然质心的求解会出现误差) 2.基于向量的解法. 该算法的核心思想是:先求出凸包,凸包的对称 ...

  9. 求对称点的坐标(已知对称轴函数解析式,自用)

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int ...

最新文章

  1. 关于学习Python的一点学习总结(6->元组)
  2. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、使用set_major_locator函数指定坐标轴主刻度数值倍数(MultipleLocator)
  3. OpenCV中SUFR、SIFT无法使用的原因及解决办法
  4. java句子中找单词_java程序找到一个句子中每个单词的字母数
  5. jsp指令元素与动作元素
  6. mysql表空间段区块如何理解_Oracle表空间、段、区和块简述
  7. JS 几种数据类型及其转换
  8. MariaDB基础(二)
  9. REVERSE-PRACTICE-CTFSHOW-3
  10. sysctl.conf文件详解
  11. 和表头对齐 表格_29 HTML中表格的其他特性
  12. .Net程序集强签名详解
  13. 零基础学python图文版-给伸手党的福利:Python 新手入门引导
  14. SQL创建数据库– PostgreSQL,MySQL,SQL Server
  15. prism.js让页面代码变漂亮
  16. 随手记_C++常考面试题
  17. Java速成:37-贷款计算器
  18. 实用的latex报告排版模板
  19. excel表格末尾添加一行_七夕表白,用Excel试试!抖音爆红,一晚点赞破百万
  20. Spring Init Destory

热门文章

  1. ES6中的rest参数
  2. 基于MSM 的tomcat session 共享
  3. Spring MVC集成Spring Data Reids和Spring Session实现Session共享
  4. 第7篇-JAVA面向对象Ⅲ
  5. 抽取、转换和装载介绍(八)实时的意义(待续)
  6. 【转】Office 2003 EXCEL多窗口打开
  7. JavaScript下拉菜单的例子
  8. Visio绘制功能分解图
  9. 国际域名转出ICANN投诉
  10. 4.3.3 IPv4地址