yuri01 题解分享 · 2025/1/29
螺旋折线(编程题) - 题解
```cpp // https://dashoj.com/d/lqbproblem/p/52 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a, b; ll dis(ll x, ll y) { ll result = 0; if (x == 0 && y == 0) return result; // ll lap = max(abs(x), abs(y)); for (ll i = 1; i <= lap - 1; i++) result += 8 * i; if (y > 0) if (x > 0) // if (x > y) result += lap * 4 + (lap - y); // else if (x < y) result += lap * 4 - (lap - x); // else result += lap * 4; // else if (x < 0) // if (abs(x) < y) result += lap * 3 + x; // else if (abs(x) > y) result += lap + y; // else result += lap * 2; // else result += lap * 3; // else if (y < 0) if (x < 0) // if (abs(x) > abs(y)) result += lap + y; // else if (abs(x) < abs(y)) result += lap * 7 + abs(x); else result += lap * 8; // else if (x > 0) // if (abs(y) > x) result += lap * 6 + (lap - x); else if (abs(y) < x) result += lap * 5 + abs(y); else result += lap * 6; // else result += lap * 7; // else if (x > 0) result += lap * 5; // else result += lap; // return result; } int main() { cin >> a >> b; cout << dis(a, b) << endl; return 0; } ```
查看全文
0 0 1 5
hardy 题解分享 · 2024/4/9
螺旋折线(编程题) - 题解
在B站上学到的一位大佬的思路,如下: ``` //核心在于改变图形模样,使其变成一个简易图形 //以第一圈为例 将第一个线段以点(-1,0)为中心顺时针方向旋转90° //这会形成一个正方形 而后将每个多出来的线段移位 //使螺旋折现变成一个又一个的同心正方形 //再根据x,y的正负取值进行分类讨论 #include<bits/stdc++.h> #define int long long using namespace std; signed main(){ int x,y,dis=0; cin >> x >> y; int jud = max(abs(x),abs(y));//点所在的层数 int inside=0,outside=0; if(x==0&&y==0){ inside=outside=0; } for(int i=1;i<jud;i++) inside+=i*8; if(jud == abs(y)){ if(y>0) outside=3*y+x; else outside=7*(-y)-x; } if(jud == abs(x)){ if(x>0) outside=5*x-y; else outside=(-x)+y; } dis = inside + outside; cout << dis; return 0; } ```
查看全文
0 0 2 17
最后的路标 题解分享 · 2024/4/7
螺旋折线(编程题) - 题解
``` #include <bits/stdc++.h> #define endl '\n' typedef long long ll; using namespace std; //数据结构在这里定义 ll x,y; void solve(){ cin >> x >> y; if(x==0&&y==0){ cout << "0" << endl; return; } ll n = max(abs(x), abs(y)); //第一象限对角线的值有规律,以他做基准 ll res = 4*n*n;//(1,1)=4;(2,2)=16 ll dx = n - x; ll dy = n - y; //y=x右下方的点是从这个基准往后走的 if(x>=y){ cout << res + dx + dy; }else{ //左上方的点是从基准往回走 cout << res - dx - dy; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t;//多组数据要cin //cin >> t; t = 1; while(t--){ solve(); } return 0;//必须加return 0 } ```
查看全文
0 0 0 11
again 题解分享 · 2024/4/11
螺旋折线(编程题) - 题解
有几个特殊的点(a, a), (a, -a), (-a, -a)比如从(a, a)出发,设n = 2 a,那么接下来变化规律为n, n - 1, n-1,n-2,n-2 .... 2,2,1,1,直接用求和公式算即可,其他两个点也是这个规律,就是第一项需要做一下处理,根据点的坐标判断这个点是在正方形的哪条变上,然后映射到离他近的这三个点中的一个即可。 ```python [x, y] = list(map(int, input().strip().split(' '))) d_x, d_y = 0, 0 res = 0 if abs(x) == abs(y): d_x = x d_y = y elif x >= 0 and abs(y) < abs(x): # 这个点在正方形的右边,映射到(x, x) d_x = x d_y = x res += abs(y - d_y) # 补上路程 elif abs(y) > abs(x): # 这个点在正方形的上下两条边,映射到(-y, y) d_y = y d_x = -y res += abs(x - d_x) else: # 这个点在正方形的左边,第三象限的顶点横纵坐标绝对值不等,我们映射到第二象限的顶点 d_x = x d_y = -x res -= abs(y - d_y) # 这样映射实际上多走了路程,需要减掉 n = 0 if d_x > 0 and d_y > 0: #第一象限的顶点规律为5,4,4,3,3 ... n = d_x * 2 res += (1 + n)* n - n # 去掉多加的一个n elif d_x > 0 and d_y < 0: n = d_x * 2 res += (1 + n) * n elif d_x < 0 and d_y > 0: n = d_y * 2 - 1 res += (1 + n) * n else: res = 0 print(res) ```
查看全文
0 0 0 9
Heng_Xin 题解分享 · 2024/4/7
螺旋折线(编程题) - 题解
方法不唯一, 我是使用 y = x (x >= 0)处的直线作为基准点, 然后计算两个不同的范围判断的qwq.. 对于 y = x 上的点, 有 原点到它上面的线段和为 $(x + y)^2$ (怎么得出来的? 我画图数数找规律的) 对于任意的点 (x, y), 我可以构造出 其环在 y = x 处的点到原点的线段和为 $(max(|x|, |y|) 2)^2$ 具体见代码, 方法不唯一! ```Cpp #include <iostream> using namespace std; using ll = long long; int main() { ll x, y; ll res = 0; cin >> x >> y; ll abs_x = abs(x); ll abs_y = abs(y); ll xy = max(abs_x, abs_y); // y = x 那条直线 res = xy; res <<= 1; res *= res; // 1e9 * 2 ^ 9 if (y < xy && x >= 0 || (y == -xy && x >= -xy)) { // 加 res += (xy - y); res += (xy - x); } else { res -= (xy - x); res -= (xy - y); } cout << res << '\n'; return 0; } ```
查看全文
0 0 0 2