-
不知为何点赞越来越多,来更新一下这个题的详细思路。 - 2022/3/18
-
找规律可以发现每层的右上角点所需步数为为4k2,求任意一个点的dis首先找到这个点所在的层数
如果在该层的左或上则减去该点到右上角曼哈顿距离,
如果在该层的右或下则加上该点到右上角曼哈顿距离;
不懂曼哈顿距离的可以先百度一下,十分简单的定义,思路不懂的可以在评论区留言或看下评论区的解释。
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long x,y; cin>>x>>y;
long long k = max(abs(x), abs(y));
if(x >= y) cout<<4 * k * k + abs(x - k) + abs(y - k)<<endl;
else cout<<4 * k * k - abs(x - k) - abs(y - k)<<endl;
return 0;
}
曼哈顿距离就是 , 两点间只走平行于坐标轴直线的距离之和。
比如直角坐标系中,就是只走平行线、垂直线,相加就是曼哈顿距离,对应题目中的折线构成。
贴个自己理解滴注释
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL x, y; cin >> x >> y; //1.寻找点所在的层数 //------- LL k = max(abs(x) , abs(y) ); //注意先取绝对值,然后取max,若是负数取max之后,绝对值是小的,对应层数就错误了 //------- //找规律发现 y = x对角线的步数恰好是 4 * x^2 (x 和 y相等,此处写哪个都可以) //2.根据在中间节点的前后,判断前进还是后退。(以y=x直线作为划分) LL res = 0; if(x >= y) //对角线的下半部分,加上距离对角点的曼哈顿距离 res = 4 * k * k + abs(k - x) + abs(k - y); //前进 else res = 4 * k * k - abs(k - x) - abs(k - y); //后退 cout << res << endl; return 0; }
做出中等题的感觉原来是这样
我靠,我还想着自己模拟出来,一个小时都没对
优雅,太优雅了。
怎么找到这个规律的,tql
太妙了
太优雅了,膜拜
tql
elegance
妙啊
orz
太优雅了
膜拜大佬!
tql,咋找出这个规律的
优雅
优雅
666
666
%
tql