题解:P11062 【MX-X4-T2】「Jason-1」加法

考虑两种情况:

  1. \(a,b\) 符号相同:

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

\(a\) \(b\) \(\lvert a-b \rvert\)
操作1 \(a+b\) \(b\) \(\lvert a \rvert\)
操作2 \(a\) \(a+b\) \(\lvert b \rvert\)

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

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

  1. \(a,b\) 符号不同

    答案为 \(0\)。下面给出理由:

    因为改变 \(a,b\) 的位置不会影响结果,所以设 \(a\) 为正数,\(b\) 为负数。

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

    • 假如 $\lvert a\rvert>\lvert b\rvert $,我们执行 $ a\gets a+b \(,\)\lvert a\rvert$ 变小。
    • 假如 \(\lvert b\rvert>\lvert a\rvert\),我们执行 $ b\gets a+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;
}
posted @ 2024-09-30 20:17  cly312  阅读(47)  评论(0)    收藏  举报