原题:
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 the figure into two identical halves. The figure on the right is not left-right symmetric as it is impossible to find such a vertical line.
Write a program that determines whether a figure, drawn with dots, is left-right symmetric or not. The dots are
all distinct.
Input
The input consists of T test cases. The number of test cases T is given in the first line of the input file. The
first line of each test case contains an integer N , where N ( 1 N 1, 000) is the number of dots in a figure.
Each of the following N lines contains the x-coordinate and y-coordinate of a dot. Both x-coordinates and
y-coordinates are integers between -10,000 and 10,000, both inclusive.
Output
Print exactly one line for each test case. The line should contain YES' if the figure is left-right symmetric. and
NO’, otherwise.
The following shows sample input and output for three test cases.
Sample Input
3
5
-2 5
0 0
6 5
4 0
2 3
4
2 3
0 4
4 0
0 0
4
5 14
6 10
5 10
6 14
Sample Output
YES
NO
YES
中文:
给你一堆点,让你判断这些点是否有左右对称轴。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t,n,ave;
cin>>t;
set<pair<int,int>> si;
while(t--)
{
cin>>n;
si.clear();
ave=0;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
ave+=x;
si.insert(make_pair(x*n,y));
}
int flag=1;
for(auto it=si.begin();it!=si.end();it++)
{
int x=it->first,y=it->second;
if(si.find(make_pair(ave*2-x,y))==si.end())
{
flag=0;
break;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
解答:
如果是对称的图,那么仅仅用x坐标表示成一条垂直于x轴的直线应该也是对称的,而且对称x坐标就是这些x轴的平均值。所以枚举所有点,判断这个点关于平均值对称的点是否存在与之前保存的set当中即可。这里把x坐标的值全乘以n,避免精度问题。