【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
题目传送门
离 CSP 初赛只剩两天了,祝各位 OIers rp ++!!!
题解
挺有意思的一道思维题,不过比赛的时候没想出来。
需要分类讨论两种情况:
- 当 a a a, b b b 为异号时
当 a a a, b b b 为一正一负时,我们对于绝对值较大的数,将其赋值为 a + b a+b a+b,进行完操作后,可得操作完后 a a a, b b b 要么一正一负,要么其中一个为 0 0 0,对于前者继续重复上述操作,通过这种类似辗转相除法的操作,最后一定会出现 0 0 0。
- 当 a a a, b b b 为同号时
经过暴力枚举,不难看出只进行零次或一次操作后可以取到最小值。
所以答案为 min ( ∣ a ∣ , ∣ b ∣ , ∣ a − b ∣ ) \min(\left|a\right|,\left|b\right|,\left|a-b\right|) min(∣a∣,∣b∣,∣a−b∣)。
代码
#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {inline int read() {register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;}inline void write(int x) {if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 + '0');return;}
}
using namespace fastIO;
int T, a, b;
int main() {//freopen(".in","r",stdin);//freopen(".out","w",stdout);T = read();for(int i = 1; i <= T; i ++) {a = read(), b = read();if(a < 0 && b > 0 || a > 0 && b < 0) {write(0), putchar('\n');}else {write(min({abs(a), abs(b), abs(a - b)})), putchar('\n');}}return 0;
}