美文网首页
第九届蓝桥杯_螺旋折线

第九届蓝桥杯_螺旋折线

作者: 掌灬纹 | 来源:发表于2019-03-21 13:53 被阅读0次

该题为数学问题,值得注意的是状态要考虑仔细,由其在比赛过程中,时间很重要,不要操之过急;仔细,认真又不呆滞是最好的。也可能是我比较笨,在比赛中推导函数方程我是几乎做不到的,不过枚举状态还是比较简单的,只要仔细就行了。

标题:螺旋折线

p1.png

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

对于整点(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

枚举状态思路:(这里需要在纸上画一画)

逆向还原图形思路

所有点在坐标轴上可能的情况,先以Y轴未分界线考虑两侧点情况(细心,耐心,仔细)

分成两个大方向考虑:Y轴右侧&Y轴左侧

Y轴右侧:x >= 0

1.点在x轴上或x轴下方并且x >= abs(y), y++

2.x轴下方 x < abs(y), x++

3.x轴上方 x > y, y++

4.x轴上方 x <= y, x--

Y轴左侧:x < 0

1.y >= 0:

  *(1)abs(x) < y, x--

  *(2)abs(x) >= y, y-- if(x == -1) res++; return res;//走到最后一行

2.y < 0:

  if ..abs(x) > abs(y)+1 y--

  else x++

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int x = sc.nextInt();

int y = sc.nextInt();

int res = dis(x, y);

System.out.println(res);

}

private static int dis(int x, int y) {

int res = 0;

if(x == 0&&y == 0) {

return 0;

}

while(true) {

if(x >= 0) {

if(y <= 0) {//x轴下方

if(x >= Math.abs(y)) {

y++;

res++;

}

else {

x++;

res++;

}

}else {//x轴上方

if(x > y) {

y++;

res++;

}

else {

x--;

res++;

}

}

}else if(x < 0) {

if(y >= 0) {

if(Math.abs(x) < y) {

x--;

res++;

}

else {

if(x == -1&&y == 0)

return ++res;

y--;

res++;

}

}else {

if(Math.abs(x) > Math.abs(y) + 1) {

y--;

res++;

}else {

x++;

res++;

}

}

}

}

}

}

相关文章

网友评论

      本文标题:第九届蓝桥杯_螺旋折线

      本文链接:https://www.haomeiwen.com/subject/mvpqvqtx.html