第九届蓝桥杯省赛CB 7.螺旋折线【思维】

Date:2022.04.01
题意描述:
如下图所示的螺旋折线经过平面上所有整点恰好一次。
在这里插入图片描述

对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9
给出整点坐标 (X,Y),你能计算出 dis(X,Y) 吗?
输入格式
包含两个整数 X,Y。
输出格式
输出一个整数,表示 dis(X,Y)。
数据范围
−109≤X,Y≤109
输入样例:
0 1
输出样例:
3

思路:观察可得找到绝对值最大的横纵坐标,其abs(maxx)-1则为maxx-1个“同心正方形”,边长递增。由此,单独讨论 y = x 、 y = − x y=x、y=-x y=xy=x两条线划分出的四个区间以及四个边界。
代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL x,y;
int main()
{
    cin>>x>>y;
    LL maxx=max(abs(x),abs(y)),ans=0;
    //四个角单独考虑,不能有交集
    if(abs(x)==abs(y)&&x<0&&y>0) ans+=maxx*2;
    else if(abs(x)==abs(y)&&x>0&&y>0) ans+=maxx*4;
    else if(abs(x)==abs(y)&&x>0&&y<0) ans+=maxx*6;
    else if(abs(x)==abs(y)&&x<0&&y<0) ans+=maxx*8;
    //四个象限单独考虑
    if(x<0&&(y>-maxx&&y<maxx)) ans+=y+maxx;
    else if(y>0&&(x>-maxx&&x<maxx)) ans+=3*maxx+x;
    else if(x>0&&(y>-maxx&&y<maxx)) ans+=4*maxx+abs(y-maxx);
    else if(y<0&&(x>-maxx&&x<maxx)) ans+=6*maxx+abs(x-maxx);
    ans+=8*(maxx-1)*maxx/2;
    cout<<ans;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值