P11062 【MX-X4-T2】「Jason-1」加法
题目背景
原题链接:https://oier.team/problems/X4C。
题目描述
给定两个整数 a , b a, b a,b(可能为负),你可以进行任意多次操作(也可以不操作),每次操作你需要在如下两种形式中进行选择:
- 操作 1:将 a a a 赋值为 a a a 与 b b b 的和,即 a ← a + b a \gets a + b a←a+b。
- 操作 2:将 b b b 赋值为 a a a 与 b b b 的和,即 b ← a + b b \gets a + b b←a+b。
你的目标是最小化 a a a 与 b b b 的差的绝对值 ∣ a − b ∣ \lvert a-b \rvert ∣a−b∣,请输出最小值。
输入格式
本题输入包含多组数据。
第一行,一个正整数 T T T,表示数据组数。对于每组数据:
- 仅一行,两个整数 a , b a, b a,b。
输出格式
对于每组数据:
- 仅一行一个整数,表示答案。
输入输出样例 #1
输入 #1
5
1 1
3 7
-4 1
-5 -8
4 0
输出 #1
0
3
0
3
0
输入输出样例 #2
输入 #2
2
-6 9
34 -51
输出 #2
0
0
说明/提示
【样例解释 #1】
对于第 1 组数据,一种可行的操作方案是:不进行任何操作, ∣ a − b ∣ = 0 \lvert a-b \rvert=0 ∣a−b∣=0。
对于第 2 组数据,一种可行的操作方案是:先使用操作 2, b b b 被赋值为 10 10 10;再使用操作 1, a a a 被赋值为 13 13 13,此时 ∣ a − b ∣ = 3 \lvert a-b \rvert=3 ∣a−b∣=3,可以证明这是能够达到的最小值。
对于第 3 组数据,一种可行的操作方案是:连续使用 5 5 5 次操作 1, a a a 依次被赋值为 − 3 , − 2 , − 1 , 0 , 1 -3,-2,-1,0,1 −3,−2,−1,0,1,此时 a a a 和 b b b 相等, ∣ a − b ∣ = 0 \lvert a-b \rvert=0 ∣a−b∣=0。
对于第 4 组数据,一种可行的操作方案是:不进行任何操作,此时 ∣ a − b ∣ = 3 \lvert a-b \rvert=3 ∣a−b∣=3。
对于第 5 组数据,一种可行的操作方案是:使用操作 2, b b b 被赋值为 4 4 4,此时 ∣ a − b ∣ = 0 \lvert a-b \rvert=0 ∣a−b∣=0。
【样例解释 #2】
对该样例中的两组数据,均可先使用 1 1 1 次操作 2,再使用 3 3 3 次操作 1,使得差的绝对值为 0 0 0。
【数据范围】
测试点编号 | 特殊性质 | 分值 |
---|---|---|
1 | A | 27 27 27 |
2 | B | 31 31 31 |
3 | 无 | 42 42 42 |
- 特殊性质 A:保证 ∣ a ∣ , ∣ b ∣ ≤ 10 \lvert a \rvert, \lvert b \rvert \le 10 ∣a∣,∣b∣≤10。
- 特殊性质 B:保证 a , b ≥ 1 a,b \ge 1 a,b≥1。
对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 1 0 5 1 \le T \le 10^5 1≤T≤105, ∣ a ∣ , ∣ b ∣ ≤ 1 0 9 \lvert a \rvert, \lvert b \rvert \le 10^9 ∣a∣,∣b∣≤109。
C++实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void solve() {
ll a, b;
cin >> a >> b;
if (a < b) swap(a, b);
if (a * b >= 0)
cout << min({abs(a), abs(b), abs(a - b)}) << endl;
else {
cout << 0 << endl;
}
}
main() {
int t; cin >> t; while (t--) solve();
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容