uvaoj-1595:symmetry
2016-02-25 20:22
274 查看
1595 - Symmetry
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.
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.
is left-right symmetric. and `NO', otherwise.
The following shows sample input and output for three test cases.
题解:刘汝佳白书135页练习题5.6;本题可以考虑暴力求解,也可以用set的查找来进行;
code:
#include <iostream>
#include <set>
#include <string>
using namespace std;
typedef pair<int,int> point;//定义类型;(不可以用预处理)
set<point> se;
int main()
{
int cas;
int n;
int x,y;
cin>>cas;
while(cas--)
{
se.clear();
cin>>n;
int sum=0;
for(int i=0; i<n; i++)
{
cin>>x>>y;
sum+=x;//将所有横坐标加和;
se.insert(point(x*n,y));//(备注1)
}
/*
set<point> ::iterator it;
for(it=se.begin(); it!=se.end(); ++it)
{
point p=*it;
cout<<p.first<<" "<<p.second<<endl;
}
*/
set<point> ::iterator it;
bool flag = true;
for(it=se.begin(); it!=se.end(); ++it)
{
point p=*it;
if(se.find(point(2*sum-p.first,p.second))==se.end())
{
flag=false;
break;
}
}
flag? cout<<"YES"<<endl: cout<<"NO"<<endl;
}
return 0;
}
备注1:
x*n的意思,就是存储的时候将横坐标扩大n倍,因为对称轴肯定是竖线,所以假设对称的话所有的横坐标加和再与n想除得出的应该就是答案的x坐标;之所以不是将sum/n,是因为考虑到精度的问题,除的话会出现double类型;换而言之,这个存储方式就是将所有横坐标扩大了n倍;
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 isgiven 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 figureis 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
题解:刘汝佳白书135页练习题5.6;本题可以考虑暴力求解,也可以用set的查找来进行;
code:
#include <iostream>
#include <set>
#include <string>
using namespace std;
typedef pair<int,int> point;//定义类型;(不可以用预处理)
set<point> se;
int main()
{
int cas;
int n;
int x,y;
cin>>cas;
while(cas--)
{
se.clear();
cin>>n;
int sum=0;
for(int i=0; i<n; i++)
{
cin>>x>>y;
sum+=x;//将所有横坐标加和;
se.insert(point(x*n,y));//(备注1)
}
/*
set<point> ::iterator it;
for(it=se.begin(); it!=se.end(); ++it)
{
point p=*it;
cout<<p.first<<" "<<p.second<<endl;
}
*/
set<point> ::iterator it;
bool flag = true;
for(it=se.begin(); it!=se.end(); ++it)
{
point p=*it;
if(se.find(point(2*sum-p.first,p.second))==se.end())
{
flag=false;
break;
}
}
flag? cout<<"YES"<<endl: cout<<"NO"<<endl;
}
return 0;
}
备注1:
x*n的意思,就是存储的时候将横坐标扩大n倍,因为对称轴肯定是竖线,所以假设对称的话所有的横坐标加和再与n想除得出的应该就是答案的x坐标;之所以不是将sum/n,是因为考虑到精度的问题,除的话会出现double类型;换而言之,这个存储方式就是将所有横坐标扩大了n倍;
相关文章推荐
- Java如何操作Android的adb shell 之 我自己在程序中的使用方法
- PAT 1065
- DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
- IOS-上架APP之启动页设置(新手必看!)
- HTTP协议中,GET方法与POST方法比较
- setjmp and longjmp
- OPenCV学习09
- Java如何操作Android的adb shell
- 学习JavaMail
- 单词统计(未完成)
- Deep Neural Network
- Web Service中的几个重要术语
- 循环语句练习题
- AVL树(平衡二叉树)
- codeforces625BWar of the Corporations
- 360doc内文章复制保存方法
- 谈乔布斯艺术家情怀的魅力
- ubuntu离线安装mysql
- 百度基础架构部-分布式存储组面试经历
- Android Studio 安装教程