-
定位:2018年第九届蓝桥杯省赛C/C++ B组试题G
-
原题:螺旋折线
如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。 -
属性:几何规律
-
难度:半神级
-
独白:
看了半天,想来想去,就是没有发现什么很好的规律可以用式子表达出来的,看了别人的思路,好像也不是很懂???(⊙o⊙)…
这里有一张图,说不定你可以借助这张图和以下代码将这题理解了。
-
代码:
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long x,y,sum;
scanf("%lld%lld",&x,&y);
if(y>=x&&y>=(-x))//点在上边
{
sum=y+x+2*y*y+2*((y-1)*(y-1)+(y-1));
}
else if(y<x&&y>=(-x))//点在右边
{
sum=x-y+(x-1)*(x-1)+x-1+2*(x*x)+x*x+x;
}
else if(y<=x&&y<=(-x))//点在下边
{
sum=-x-y+2*((-y)*(-y)-y)+2*((-y)*(-y));
}
else//点在左边
{
sum=y-x-1+(-x-1)*(-x-1)+(-x)*(-x)+2*((-x-1)*(-x-1)+(-x-1));
}
printf("%lld\n",sum);
return 0;
}
- 总结:几何规律看运气,如果想不出好的式子来表达,那就放弃吧~
- 感悟:不要后悔,你的看不起使本该属于你的东西跑到了别人手中。
- 归档:未归档。