3 条题解

  • 1
    @ 2024-10-5 16:26:16

    X4C 题解

    思路

    a+baa + b \to a 差值为 a|a|

    a+bba + b \to b 差值为 b|b|

    …………

    结论是后面会一直延续下去,都是 a|a|b|b|

    所以答案为 min(a,b,ab)\min(|a|,|b|,|a-b|)

    注:

    再证明一件事情,如果 a,ba, b 异号,答案一定为 00 (样例2的提示)。

    假设 a0ba \le 0 \le b

    用伪代码那来解释一下:

    while a+b > 0 : b = a + b
    
    结束后
    
    if a + b == 0 : {
        a = a + b  // a = 0
        b = a + b  // b = a
        abs(a - b) = 0
    } else : {
        while a + b < 0 : a = a + b
        while a + b > 0 : b = a + b
        因为 a b 的差一直减小,
        所以显然最后 a + b = 0
    }
    

    重点细节

    不开long long见祖宗

    Code

    #include <bits/stdc++.h>
    #define int long long
    #define endl() putchar('\n')
    #define space() putchar(' ')
    #define to_ans() putchar('&')
    #define to_debug() putchar('^')
    #define debug() puts("runs there")
    using namespace std;
    
    inline int read() {
    	int x = 0, f = 1;
    	char ch = getchar();
    	while (!isdigit(ch)) {
    		if (ch == '-') f = -1;
    		ch = getchar();
    	}
    	while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    	return x * f;
    }
    
    void write(int x) {
    	if (x < 0) putchar('-'), x = -x;
    	if (x > 9) write(x / 10);
    	return void(putchar(x % 10 + 48));
    }
    
    int a, b;
    
    signed main() {
    	int T = read();
    	while(T--) {
    		a = read(), b = read();
    		if(a * b <= 0) write(0), endl();
    		else write(min({abs(a), abs(b), abs(a - b)})), endl();
    	}
    	return void(endl()), signed(0);
    }
    

    信息

    ID
    56
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    650
    已通过
    234
    上传者