ウバ1595の対称軸
件名の説明:
Nは、平面内の点を与え、そのため、すべての点対称の周りに、垂直線を見つけるためにかどうかを尋ねました。
アイデア:
この問題は、総数Nは、xのそれぞれの平均高さ限り同じ偶数である場合、各対称を見つけることができ、x高さを同じ座標点を平均全て私の考えの高さ(Y)であります軸、及びNは、同じ平均値と中央値は、それができれば、全てのx座標の重心の平均に基づいて、同じものを見つけることが必要であり、奇数です。
私はいくつかの複雑な条件をやってみたかったときに、いくつかのより多くの無駄な判断を支払います。試験データの2つのセットが、参照により、本明細書で提供されます。
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:
また、私はまた、私の上、この単純な多くのより2つのオンラインの方法を参照してください。
一つは、二つの点xの最大値と最小値を見つける全体グラフィック対称であるかのように、対称の軸として中点にそれらを取るために、したがってシャフトの中間点は、最も対称のうちの2つを指摘しなければなりません。次いで、トラバースの各点について、点対称、それかどうかを確認します。
:リンクを参照してください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を