uva 1595

一道关于stl map的习题,并不是很复杂。

关于是否对称,我是先把所有坐标y值一样的存起来,用vector保存相应x的值。

然后遍历整个map,对于每一组y坐标一样的点,对其x值进行排序。

将x的最大值和最小值相加作为竖线的x值(的2倍),看看这条直线是否满足要求即可。

#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

map<int,vector<int> >  m;

//判断2*x=line 这条竖线是否满足题目要求
bool judge(int line){
    bool flag = true;
    for(map<int,vector<int> >::iterator it = m.begin();it!=m.end();it++){
        vector<int> v = it->second;
        sort(v.begin(),v.end());
        int size = v.size();
        for(int i=0;i<(size/2+1);i++){
            if(size%2 == 0 && i==size/2) continue;
            if(v[i]+v[size-1-i] != line) {
                flag = false;
                return flag;
            }
        }
    }
    return flag ;
}

int main(){
    int T,n,a,b;
    cin >> T;
    while(T--){
        m.clear();
        cin >> n;
        while(n--){
            cin >> a >> b;
            if(m.count(b)) m[b].push_back(a);
            else {
                vector<int> v;v.push_back(a);m[b] = v;
            }
        }
        bool ff = false;
        for(map<int,vector<int> >::iterator it = m.begin();it!=m.end();it++){
            //sort((it->second).begin(),(it->second).end());
            vector<int> vt = it->second;
            sort(vt.begin(), vt.end());
            int len = vt.size();
            for(int i=0;i<(len/2+1);i++){
                //如果vector数组是偶数的话则跳过
                if(len%2 == 0 && i==len/2) continue;
                bool f = judge(vt[i]+vt[len-1-i]);
                if(f){ff=true;break;}
            }
            if(ff) break;
        }
        if(ff) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return  0;
}
时间: 2024-10-27 08:14:31

uva 1595的相关文章

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第五章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 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