Uva1595 对称轴

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

时间: 2024-10-22 21:41:03

Uva1595 对称轴的相关文章

BZOJ 1100: [POI2007]对称轴osi

1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Status][Discuss] Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题.不幸的是,yours是一个十分用功的学生,所

BZOJ1100 对称轴osi (回文串)

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1100分析:将多边形转化为如下的环:角度0->0到1的边长->角度1->1到2的边长->...->角度n-1->n-1到0的边长.将其存到s中,再将s复制一遍存到后面.然后枚举对称轴i,无非在边或顶点上,如果i为对称轴,那么[i-n,i+n]是一个回文串.用Manacher算法算出以i为对称轴的最长回文串向左或右延伸的最大长度(包括i),当大于n时,说明以i为轴,两侧

BZOJ1100: [POI2007]对称轴osi

1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 334  Solved: 130[Submit][Status] Description FGD小朋友——一个闻名遐迩的年轻数学家——有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题.不幸的是,yours是一个十分用功的学生,所以她不停地让FGD

BZOJ 1100 POI2007 对称轴osi 计算几何+KMP算法

题目大意:给定一个多边形,求对称轴数量 我X 这究竟是怎么想到KMP的-- 首先 将边字符化 即找到这个多边形的中心 然后用与中心构成的三角形的边-角-边的方式表示这条边 将边顺时针扫一遍 然后倍增至长度为2n-1 再逆时针扫一遍 逆时针扫的那遍在顺时针那遍中出现的次数就是对称轴数目 用KMP算法就能搞出来 证明自己YY吧 出题人卡精度丧心病狂... #include <cmath> #include <cstdio> #include <cstring> #inclu

Symmetry(对称轴存在问题)

Symmetry Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper along a vertical line, drawn as a dashed line, and to cut th

UVa1595,Symmetry

这题居然是1A过的.....最近无比失落的心情顿时愉悦起来~ 将数据全部读入 先用二维数据来存储坐标(先把题做出来再说= =) 题目中的x,y的坐标范围是-1W到1W....在数组下标里是不能用负数保存的(当然你偏用map当额没说= =),其实可以把x坐标左移1W个单位,这样最小坐标就从0开始了 然后随便找一行y(当然保证该行至少存在一点),那么可以确定这条竖线mid 枚举每一行,以mid为中点向两边扩展,每找到一对x1,x2,判断equal(mid-x1,x2-mid),若否,直接退出循环,输

bzoj 1100 [POI2007]对称轴osi manacher

[POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 771  Solved: 307[Submit][Status][Discuss] Description FGD小朋友——一个闻名遐迩的年轻数学家——有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题.不幸的是,yours是一个十分用功的学生,所以她不停地让

[数学推导]对称轴

源自校内模拟赛 Statement 求 \[(\sum_{i=0}^{p-1}\binom{2i}im^i)\bmod p\] \(1\le m<p\le 10^{14}\) ,\(p\) 为质数 多组数据,数据组数不超过 \(10^4\) Solution 神仙题 一个转化: \[\binom{2n}n=\frac 1{(n!)^2}(\prod_{i=1}^n(2i-1))(\prod_{i=1}^n2i)=\frac{2^n}{n!}\prod_{i=1}^n(2i-1)\] 这看上去没什

URAL - 1963(几何)

不知道是不是几何题,反正就是找对称,值得注意的是,对称轴不一定过点,还可能在边上 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; const double mm=1e-7; double x[10],y[10]; bool deng(double a,double