4 条题解

  • 0
    @ 2024-10-4 16:43:54

    考虑两种情况:

    1. a,ba,b 符号相同:

      考虑经过操作后 a,b,∣a−b∣a,b,\lvert a-b \rvert 会变成什么。:

    aa bb ∣a−b∣\lvert a-b \rvert
    操作1 a+ba+b bb ∣a∣\lvert a \rvert
    操作2 aa a+ba+b ∣b∣\lvert b \rvert

    可以看出只进行零次或一次操作后可以取到最小值。

    所以答案为 $\min(\lvert a \rvert,\lvert b \rvert,\lvert a-b \rvert)$。

    1. a,ba,b 符号不同

      答案为 00。下面给出理由:

      因为改变 a,ba,b 的位置不会影响结果,所以设 aa 为正数,bb 为负数。

      注意到每次操作都会改变 aa 或 bb 的值,并且由于 aa 和 bb 异号,如果不断将绝对值较小的数加到绝对值较大的数上,就会不断减小两者的差值:

      • 假如 ∣a∣>∣b∣\lvert a\rvert>\lvert b\rvert ,我们执行 a←a+b a\gets a+b ,∣a∣\lvert a\rvert 变小。
      • 假如 ∣b∣>∣a∣\lvert b\rvert>\lvert a\rvert,我们执行 b←a+b b\gets a+b,∣b∣\lvert b\rvert 变小。

      由于每次操作都使得较大绝对值的数减小,因此可以类比辗转相减法,这种操作一定会在若干次后使得其中一个数变为 0。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
    	int t;
    	cin>>t;
    	while(t--){
    		int a,b;
    		cin>>a>>b;
    		if((a<0&&b>0)||(a>0&&b<0)) cout<<0<<endl;
    		else cout<<min({abs(a),abs(b),abs(a-b)})<<endl;
    	}
    	return 0;
    }
    

    信息

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