蓝桥杯2018年第九届真题-螺旋折线

蓝桥杯2018年第九届真题-螺旋折线

如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(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)

样例

输入复制

0 1

输出复制

3

提示

数据规模

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

阅读完此题 我们可以利用数学中的线性规划的知识,我们可以找到每一圈都有一个“目标节点”,代表完成了一圈,例如第一圈的结束点为(1,1),为什么是(1,1)因为点(0,1)和点(1,1)之间的线段可以补充到点(0,1)和点(0,0)之间缺失的线段,这样就可以形成一个环。依次类推,那么(2,2)也是一个“目标节点”,(3,3)(4,4)都是如此。

知道这些,我们就可以进一步的分析了,设立两个函数,当x<=0时,t1=x+1;当x>0时,t2=x。接下来我们根据点的坐标来判断点在t1 或者 t2的上面还是下面,如果在t1,t2的上面,那么此点距离下一个“目标节点”的距离假设为L, 那么要求的答案便是所有圈数的距离之和减去L,同理,如果在t1,t2的下面,那么此点距离上一个“目标节点”的距离假设为L,那么要求的答案便是所有圈数的距离之和加上L。

很多同学很好奇,圈数的距离该如何求? 这里用到的便是数学等差数列前n项和的知识,我们观察到第一个圈的距离是14,第二圈的距离是34,第三个圈是54,所以我们可以得知前n个圈的距离总数是4n*n

附上代码:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		long x=sc.nextLong(),y=sc.nextLong();
		if(x==0 && y==0) System.out.println(0);
		else if(x==-1 && y==0) System.out.println(1);
		else if(x==-1 && y==1) System.out.println(2);
		else if(x==0 && y==1) System.out.println(3);
		else if(x==1 && y==1) System.out.println(4);
		else {
			long t1=x+1,t2=x;long target_x,target_y; 
			if((x<=0&& y>=t1) || (x>0 && y>=t2)) {
				target_x=(long)Math.max(Math.abs(x), Math.abs(y));
				target_y=target_x;
				System.out.println(4*target_x*target_x-(Math.abs(x-target_x)+Math.abs(y-target_y)));
			}
			if((x<=0 && y<t1) || (x>0 && y<t2)) {
				target_x=(long)Math.max(Math.abs(x), Math.abs(y));
				target_y=target_x;
				System.out.println(4*target_x*target_x+(Math.abs(x-target_x)+Math.abs(y-target_y)));
			}
			
		}
		
	}
}

对你有帮助的小伙伴们,记得点赞【评论】加关注哦 ~ . ~

猜你喜欢

转载自blog.csdn.net/qq_49174867/article/details/123774980