第九届蓝桥杯【C/C++省赛B组】【第七题:螺旋折线】

21人阅读 评论(0) 收藏 举报
分类:

题目:

如图所示的螺旋折线经过平面上所有整点恰好一次。

对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。

例如dis(0, 1)=3, dis(-2, -1)=9

给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

【输入格式】
XY  

对于40%的数据,-1000 <= X, Y <= 1000  
对于70%的数据,-100000 <= X, Y <= 100000  
对于100%的数据, -1000000000 <= X, Y <= 1000000000  

【输出格式】
输出dis(X, Y)  
【样例输入】
 0 1

【样例输出】
 3

解题思路:

只要找出Y轴上所有点的坐标规律(称之为横向关键点),即求出后与该点所在同一横线上的距离也都可以求出了。 
规律:

y > 0 时:
当abs(x) <= y时,dis(0 , y)=3 * y + (y * y - y) / 2  * 8,所以dis(x , y)=dis(0 , y) + x;
当abs(x) >y 时, x  > 0时,dis(x , y) = dis(0 , x) + 2 * x - y。
                x  < 0时,dis(x , y) = dis(0 ,-x) + 2 * x + y。 
当y <= 0时:
当y-1 <= x <= -y 时,dis(0 , -y) = 7 * -y + (y * y + y)/2 * 8,所以dis(x , y) =dis(0 , y) - x;
当x >- y 或 x< y - 1时,x > 0 时,dis(x,y) = dis(0 , x) - 2 * x - y。               
                       x < 0 时,dis(x,y) = dis(0 , -x - 1) - 2 * x + y - 1

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
int main()
{
    ll x , y;
    ll res;
    cin>>x>>y;
    if(y > 0)
    {   
        if(abs(x)<=y)
            res = 3*y+(y*y-y)/2*8+x;    
        else
        {
            if(x > 0)
                res=3*x+(x*x-x)/2*8+2*x-y;

            else
                res=3*-x+(x*x+x)/2*8+2*x+y;
        }
    }
    else
    {
        if(y-1 <= x &&x <= -y)
            res=7*-y+(y*y+y)/2*8-x;
        else
        {
            if(x > 0)
                res=7*x+(x*x-x)/2*8-2*x-y;
            else
                res=-7*x-7+(x*x+3*x+2)/2*8-2*x+y-1;
        }
    }
    cout<<res;
    return 0;
} 
查看评论

2018第九届蓝桥杯省赛真题 C语言B组 第七题 螺旋折线

标题:螺旋折线 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如...
  • ffgcc
  • ffgcc
  • 2018-04-05 11:00:27
  • 116

2018 蓝桥杯 省赛 B组 原题 C语言B组 第7题 第九届蓝桥杯真题 螺旋折线

标题:螺旋折线如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。  对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。  例如dis(0,...
  • feifancaicai
  • feifancaicai
  • 2018-04-01 19:17:35
  • 90

20180401第九届蓝桥杯省赛B组真题-1第几天

标题:第几天2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第几天?注意:需要提交的是一个整数,不要填写任何多余内容。手算都可以,这里直接粘贴2013年 高斯日记那道题了...
  • lady_killer9
  • lady_killer9
  • 2018-04-01 16:35:40
  • 1567

2018年第九届蓝桥杯【C++省赛B组】【题目汇总】

2018年第九届蓝桥杯【C++省赛B组】【题目汇总】 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第...
  • qq_34202873
  • qq_34202873
  • 2018-04-02 09:36:59
  • 2466

第九届蓝桥杯C/C++组真题B组

  • 2018年04月08日 08:58
  • 26KB
  • 下载

2014年第五届蓝桥杯C/C++程序设计本科B组省赛 蚂蚁感冒(编程大题)

蚂蚁感冒  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。      每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。     当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。...
  • u014552756
  • u014552756
  • 2016-01-24 16:29:03
  • 1417

2018 第九届蓝桥杯省赛总结 + 解题报告(C语言B组)

2018/4/1,我参加了蓝桥杯C语言B组湖南省赛,今年第三次参加蓝桥杯了,虽然会的东西比去年多了不少,但是发挥却不如上次,最大的总结就是要细心啊! 1.第几天 2.明码 3.乘积尾零 ...
  • xp731574722
  • xp731574722
  • 2018-04-01 23:50:52
  • 918

2018年第九届蓝桥杯省赛C++B组和javaB组题目

  • 2018年04月05日 11:52
  • 135KB
  • 下载

2018省赛第九届蓝桥杯真题C语言B组

  • 2018年04月01日 16:49
  • 27KB
  • 下载

2018省赛第九届蓝桥杯真题C语言B组第六题题解 递增三元组

2018第九届蓝桥杯C++省赛B组[最新题解汇总]标题:递增三元组给定三个整数数组A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, .....
  • nka_kun
  • nka_kun
  • 2018-04-01 19:28:11
  • 222
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1373
    排名: 3万+
    最新评论