考虑两种情况:
-
\(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)\)。
-
\(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;
}
标签:Jason,rvert,int,题解,T2,lvert,绝对值,操作
From: https://www.cnblogs.com/cly312/p/18442390