【华为OD】2024年C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
【华为OD】2024年C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-优快云博客
JS、python、C、Java代码:
【华为OD】C卷真题 200分: 数字加减游戏 JavaScript代码实现[思路+代码]-优快云博客
【华为OD】C卷真题 200分: 数字加减游戏 python代码实现[思路+代码]-优快云博客
【华为OD】C卷真题 200分: 数字加减游戏 C语言代码实现[思路+代码]-优快云博客
【华为OD】C卷真题 200分: 数字加减游戏 Java代码实现[思路+代码]-优快云博客
题目描述:
小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。
每个回合,小明可以用当前的数字加上或减去一个数字。
现在有两种数字可以用来加减,分别为a,b (a ≠ b),其中b没有使用次数限制。
请问小明最少可以用多少次a,才能将数字s变成数字t。
题目保证数字s一定能变成数字t。
输入描述
输入的唯一一行包含四个正整数s,t,a,b,并且 a≠b。
输出描述
输出的唯一一行包含一个整数,表示最少需要使用多少次a才能将数字s变成数字t。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1 10 5 2
输出
1
说明
初始值1加一次a变成6,然后加两次b变为10,因此a的使用次数为1次。
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
11 33 4 10
输出
2
说明
11减两次a变成3,然后加三次b变为33,因此a的使用次数为2次。
879
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + + + | +
| + | + | + +----+ | | + + + | +
| + 3 | + | + + + 2 | | 2 + + + | +
| + | + | + + + | | + + + | +
| +---+ + | | | + ----+ | +---+ | | + | +
| | + | | | + | | | | | | + | +
| 1 | + | 8 | | + 1 | | | 1 | | 1 | | + | +
| | + | | | + | | | | | | | + | +
| +---+ + +---+ | ++---+ ++ +---+ +---+ | + | +
| | + | | | ++ | | |+ | +
|0 | + | 0 | 0 | ++ | 0 | |+ | +
| | + | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
按逻辑来实现即可,不过要考虑数值范围,按最大 long long来存储才能全部通过用例 100%,否则有个超大值没有通过,只能过95%。
代码实现:
#include <iostream>
#include <climits>
using namespace std;
long long getMinCnt(int start, int end, int a, int b){
long long ret = LONG_LONG_MAX;
if((end - start) % b == 0 || start == end){
return 0;
}
for(long long i = 1; 1 ; ++i){
if((end - start - i * a) % b == 0){
ret = min(ret, i);
break;
}
}
for(long long i = 1; 1 ; ++i){
if((end - (start - i * a)) % b == 0){
ret = min(ret, i);
break;
}
}
return ret;
}
int main(){
int start, end, a, b;
cin >> start >> end >> a >> b;
cout << getMinCnt(start, end, a, b) << endl;
return 0;
}


被折叠的 条评论
为什么被折叠?



