励志用尽量少的代码做高效的表达。
题目(提交)链接→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 Min = 20000, Max = -20000;
for(int i = 0; i < m; i++) {
cin >> x >> y;
Max = max(x,Max); Min = min(x,Min);
st.insert({x,y});
}
bool flag = false;
for(auto p : st) {
auto t = make_pair((Max+Min)-p.first,p.second); //auto的意思是自动识别类型,可以是任何类型
if(!st.count(t)) { flag = !flag; break; }
}
cout << (flag ? "NO\n" : "YES\n");
}
return 0;
}
收获:
1、set<pair<int,int>>p
:升序结构体。
2、关于坐标对称性的判定问题。
3、坐标运算尽量不要使用除法。
择苦则安,择做则乐(闲)。虚拟终究比不过真实精彩之万一。
来源:CSDN
作者:小张同学Dayday Up
链接:https://blog.csdn.net/weixin_43899069/article/details/104786415