2018年第九届蓝桥杯C++省赛B组G题

2018年第九届蓝桥杯C++省赛B组G题

螺旋折线

如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

1
啊啊啊啊这道题目,思维思维,你看出来了嘛,可以把它变成一个个正方形
2
是不是成为一个个正方形了嘛~
ans1是表示在这个坐标其中的正方形的周长
ans2是表示会在当前这个正方形的周长是多少

边长的一半a=max(abs(x), abs(y));
ans1 = 4 * (2 + …+ 2 * a + 2);
ans1 = 4 * a * (a + 1)
当x >= 0时:
1.当y >= 0时:ans2 = 3 * a + x + a - y;
2.当y < 0时:ans2 = 5 * a - y + a - x;
当x < 0时:
ans2 = a + y + x + a;

上面的式子化简就是下面的代码啦~
如果上面实在是想不出来的话模拟也可以写出来嘻嘻

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
	ll x, y;
	ll ans1 = 0, ans2 = 0;
	cin >> x >> y;
	ll a = max(abs(x), abs(y));
	ans1 = 4 * a * (a - 1);
	if (x >= 0)
	{
		if (y >= 0)
		{
			ans2 = 4 * a + x - y;
		}
		else
		{
			ans2 = 6 * a - y - x; 
		}
	}
	else
	{
		ans2 = y + x + 2 * a;
	}
	cout << ans1 + ans2 << endl;
	return 0;
}
发布了53 篇原创文章 · 获赞 2 · 访问量 1352

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/104562811