题解分享
题解分享简介
螺旋折线(编程题) - 题解
```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
螺旋折线(编程题) - 题解
在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
螺旋折线(编程题) - 题解
```
#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
螺旋折线(编程题) - 题解
有几个特殊的点(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
螺旋折线(编程题) - 题解
方法不唯一, 我是使用 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



