【多解】UVa 1595 Symmetry 对称(ACM-ICPC Seoul 2004)【附构造随机输入数据参考代码】

这篇博客探讨了如何判断一个图是否具有对称性质,通过算法描述和代码实现来展示判断过程。作者注意到计算横坐标平均值时的精度问题,并提供了优化策略,包括避免小数和使用特定的乘法运算。此外,还分享了输入数据的构造方法。
摘要由CSDN通过智能技术生成

【紫书 第五章 习题5-6】
题目比较水,总体做得还算顺利。
算法概述:如果图是对称的,那么 y 坐标相同的点归为一组,第 i 组的点的横坐标的和记为 ∑i ,点的个数记为 si ,则
∑i / si = x0(常数)①
x0 由最左侧点的横坐标与最右侧点的横坐标相加取平均确定。
即相同纵坐标的点的横坐标的和的平均值为 x0,那么对称轴就是 x = x0 。
AC代码0:(10 ms或20 ms)
提交了10次,5次是20 ms,5次是10 ms。也许是因为map里面套个vector再套个pair使得运行速率有所降低。
记映射 f:y0→{(x, y)|y = y0},即自变量为纵坐标 y0 ,因变量为数组,包含全部纵坐标为 y0 的点。cur 为当前输入的点,emptyvec 为空白变长数组vector。
输入完毕后判定 f 中每一项映射代表的点组是否符合式①。为了避免精度问题,避免了使用小数。原本我做的时候是将求得的和统一乘以10再除以si(整数点的对称轴出现小数,小数部分也只可能是.5,乘以10就是小数点右移一位)。不过根据https://blog.csdn.net/acvay/article/details/43015507 等文章,改成了乘以2。因为编译器可能将乘以2或整除2优化为二进制移位运算,加快乘法的运算速率。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
map<short, vector<pair<short, short>>> f; pair<short, short> cur; 
map<short, vector<pair<short, short>>>::iterator it, I; short XL, XR;
vector<pair<short, short>> emptyvec; int s, sum, x0_2x; bool verdict;
int main() {
   
	//freopen("o.txt", "w", stdout);
	unsigned int t; unsigned short n; scanf("%u", &t);
	for (unsigned int i = 0; i < t; ++i) {
   
		scanf("%hu", &n); f.clear(); XL = 32767, XR = -32767;
		for (unsigned short j = 0; j < n; ++j) {
   
			scanf("%hd%hd", &cur.first, &cur.second); 
			if (cur.first < XL)XL = cur.first; if (cur.first > XR)XR = cur.first;
			it = f.find(cur.second);
			switch (it == f.end()) {
   
			case true:f.emplace(cur.second, emptyvec); 
				f[cur.second].emplace_back(cur); break;
			case false:(*it)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值