22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告
励志用尽量少的代码做高效的表达。 题目(提交)链接→ UVa-1595 思路: 此题本质是一道笛卡尔坐标系上的对称性问题。 判定性问题:由于只要能判别图像是否左右对称即可,无需确认关于哪条垂直线对称,那么问题可以这样解决:将坐标升序排序后,若两侧坐标和都等于sum,再判断二者y值相同。就说明关于某条线对称。 最开始想到用 pair 结构体, p.first 存储x坐标, p.second 存储y坐标。重写 cmp() 函数,利用 sort() 对 pair 进行升序排序, (x1+x2)/2 求出 sum ,依次比较,若符合条件,则输出。 但这个想法是有bug的: 错误 :(x1+x2)/2可能是小数,而sum是int型,造成数据不准确。 解决办法:减法代替除法(坐标运算尽量避免除法),具体见代码第15行。 待优化 :用 set<pair<int,int>>s ; 代替 pair<int,int>p + sort() 。提高效率。 下面是优化后的代码: 代码: # include <bits/stdc++.h> using namespace std ; int main ( ) { int n ; cin >> n ; while ( n -- ) { int m , x , y ; cin >> m ; set < pair < int , int >> st ; int