UVA 1595
来源:互联网 发布:数据采集模块 编辑:程序博客网 时间:2024/05/16 16:55
原题链接:
大致题意: 就是给你一堆点,问是否存在对称轴。
思路:主要就是两个排序,先对x升序排序,之后对后半部分的y进行降序排序。之前以为在对称轴上的点的y值也必须相同,后来发现给的测试用例没有要求相同,可能是共线的原因吧,修了这个问题就AC了。
#include<bits/stdc++.h>using namespace std;typedef pair<int,int> P;vector<P>v;int T,x,y,n;P p;bool cmp(P p1,P p2){ if(p1.first!=p2.first){ return p1.first<p2.first; } return p1.second>p2.second;}void print(){ for(int i=0;i<n;i++){ printf(" %d %d\n",v[i].first,v[i].second); } printf("...%d...\n",T);}bool judge(){ if(n==1){ return true; } sort(v.begin(),v.end()); sort(v.begin()+(n+1)/2,v.end(),cmp); int left,right; if(n&1){ left=right=n/2; }else{ left=n/2-1; right=n/2; } for(int i=left,j=right;i>=0;i--,j++){ //这里跳过在对称轴上的点 if(v[i].first==v[j].first){ continue; } if(v[left].first-v[i].first!=v[j].first-v[right].first ||v[i].second!=v[j].second){ return false; } } return true;}int main(){ //freopen("in.txt","r",stdin); scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&p.first,&p.second); v.push_back(p); } if(judge()){ printf("YES\n"); }else{ printf("NO\n"); } v.clear(); } return 0;}
阅读全文