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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃酱斯密酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值