22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告

谁说我不能喝 提交于 2020-03-12 10:35:47

励志用尽量少的代码做高效的表达。


题目(提交)链接→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、坐标运算尽量不要使用除法。


择苦则安,择做则乐(闲)。虚拟终究比不过真实精彩之万一。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!