蓝桥杯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)));
}
}
}
}
对你有帮助的小伙伴们,记得点赞【评论】加关注哦 ~ . ~