zoukankan      html  css  js  c++  java
  • 螺旋折线(可能是最简单的找规律)【蓝桥杯2018 C/C++ B组】

    标题:螺旋折线

    如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。  
    对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。  

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

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

    【输入格式】
    X和Y  

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

    【输出格式】
    输出dis(X, Y)  


    【样例输入】
    0 1

    【样例输出】
    3


    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms

    看了很多题解,虽然都是找规律但都比较复杂,终于找到了一篇有比较简单易算规律的题解

    代码只有十行   但是不容易想到(可能只是我)  

    参考自  https://blog.csdn.net/qq799028706/article/details/84312062

    思路 :把每一层左下的边旋转90°就能得到该层的正方形,第n层的正方形边长为 n*2*4=8*n  ;

    要求找点[x,y] ,那么就先找到[x,y]所在的层数 n = max(fabs[x],fabs[y]);

    把 1至n-1层正方形的边长之和相加 再加上[x,y]到[-n,-n]需要的边长即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int main(){
      LL x, y;
      cin >> x >> y;
      LL n = max(fabs(x), fabs(y)) ;  // 判断在第几层的正方形
      LL sum = (8 + (8 * (n - 1))) * (n - 1) / 2 ; //  前n-1层四边之和  等差数列求和
      if(x < y){
          sum += 2 * n + x + y; // 正着数
      }else{
          sum += n * 8 - 2 * n - x - y; // 倒着数
      }
      cout << sum << endl;
    }


     

  • 相关阅读:
    document.body.clientHeight 和 document.documentElement.clientHeight 的区别
    Javascript操作div及其内含对象示例
    面向对象分析设计的经验原则
    翻页控件示例代码
    C#的6种常用集合类示例
    UML基础知识
    重温OSI和TCP/IP网络分层
    设计模式总结
    活用设计模式
    GridView当数据源为空时仍显示表头
  • 原文地址:https://www.cnblogs.com/llke/p/10780137.html
Copyright © 2011-2022 走看看