2022-05-16每日刷题打卡
代码源——每日一题
最喜欢数学了(高数除外) - 题目 - Daimayuan Online Judge
小明的数学很好,所以他认为世界上所有的数学问题都很简单。
但是有一天,他遇到了一个他无法解决的数学问题,所以他请求你帮助他。
小明会给你两个数字 a 和 b ,然后你应该选择一个正奇数 x 和一个正偶数 y ,你可以让 a 加上 x 或让 a 减去 y,在一次运算中。你应该在最少的操作中把 a 变成 b。请注意,在同一次运算中,你不允许改变 x 和 y 的值。
输入格式
在第一行,有一个整数 T。
接下来 T 行每行2个整数 a、b。表示由小明给出的数字。
输出格式
一个数,表示将 a 变为 b 所需的最小操作数。。
样例输入
1
10 7
样例输出
2
数据规模
所有数据保证 1≤T≤105,1≤a,b≤106。
问题解析
这是今年浙江省赛的a题,一个比较简单的结论题。
1、如果a>b:
(1)两者差是偶数,我们可以通过直接减去一个y得到(这个y是我们自己随便设的,当然可以设成这个差),所以是1步
(2)两者差是奇数时,我们可以先个a加一个奇数,这样a和b的差就是偶数了,然后同上,所以是1+1=2步
2、如果a<b
(1)两者差是奇数时,我们可以通过加上一个x得到,所以是1步
(2)如果差是偶数,此时有两种情况,一是这个差可以由两个相同的奇数得到:比如a=3,b=9,那么他们的差是6,可以由两个3得到,那么此时就是2步;第二个情况就是差不由相同的奇数得到,那么我们可以给a加上两个奇数,再减去一个偶数得到,比如a=5,b=13,差是8,我们可以给a加上两个7(确保加上后大于b即可),a=19,此时a和b差为偶数,通过之前的结论可知是一步,所以是1+2=3步。
3、如果a==b,那么一步也没有,是0.
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#define endl '\n';
typedef long long ll;
typedef pair<ll, ll>PII;
const int N = 2e5 + 50;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while (t--)
{
int x, y;
cin >> x >> y;
if (x == y)
{
cout << 0 << endl;
}
else if (x > y)
{
if ((x - y) % 2 == 0)
{
cout << 1 << endl;
}
else cout << 2 << endl;
}
else
{
if ((y - x) % 2 == 1)
{
cout << 1 << endl;
}
else if ((y - x) / 2 % 2 == 1)
{
cout << 2 << endl;
}
else cout << 3 << endl;
}
}
return 0;
}