标题:螺旋折线
如图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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
解析:按象限划分四个部分,以拐点为突破口。比赛的时候想到了,但是一紧张就没有静下心来好好分析,罪过罪过。
根据给定坐标求解拐点是比较简单的,我们对于每个点都求出它x和y中较大的那个值,然后我们可以得到:
第一象限的拐点坐标——dx = max(abs(x), abs(y)),dy = dx
第二象限的拐点坐标——dx = -max(abs(x), abs(y)),dy = -dx
第三象限的拐点坐标——dx = -max(abs(x), abs(y)),dy = dx - 1
第四象限的拐点坐标——dx = max(abs(x), abs(y)),dy = -dx
假定拐点坐标为(dx, dy),我们有
第一象限的拐点的dfs()——(abs(dx)+abs(dy))^2
第二象限的拐点的dfs()——(abs(dx)+abs(dy)) * (abs(dx)+abs(dy) - 1)
第三象限的拐点的dfs()——(abs(dx)+abs(dy))^2
第四象限的拐点的dfs()——(abs(dx)+abs(dy)) * (abs(dx)+abs(dy) + 1)
之后根据给定坐标(x, y)与拐点坐标(dx, dy)的关系就可以轻松的解出来了。
还要特别注意给定坐标中x或y等于0的情况,这里我把四种情况分别归到了四个象限中
这样求解这个问题最后时间复杂度为O(1)
import java.util.Scanner;public class Main {static int x, y;static int df = 0;public static void main(String[] args) {Scanner in = new Scanner(System.in);x = in.nextInt();y = in.nextInt();if (x > 0 && y >= 0) {int dx = Math.max(x, y);int dy = dx;df = (dx + dy) * (dx + dy);if (x < dx) {df -= (dx - x);}if (y < dy) {df += (dy - y);}} else if (x >= 0 && y < 0) {int dx = Math.max(Math.abs(x), Math.abs(y));int dy = -dx;df = (dx + Math.abs(dy)) * (dx + Math.abs(dy) + 1);if (x < dx) {df += (dx - x);}if (y > dy) {df -= (y - dy);}} else if (x < 0 && y <= 0) {int dx = -Math.max(Math.abs(x), Math.abs(y));int dy = dx + 1;df = (Math.abs(dx) + Math.abs(dy)) * (Math.abs(dx) + Math.abs(dy));if (x > dx) {df -= (x - dx);}if (y > dy) {df += (y - dy);}} else if (x <= 0 && y > 0) {int dx = -Math.max(Math.abs(x), Math.abs(y));int dy = -dx;df = (Math.abs(dx) + Math.abs(dy)) * (Math.abs(dx) + Math.abs(dy) - 1);if (x > dx) {df += (x - dx);}if (y < dy) {df -= (y - dy);}}System.out.println(df);}
}