华为OD机试:跳房子I (E卷、C++)
华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集
题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格。跳房子的过程中,可以向前跳,也可以向后跳。
假设房子的总格数是count、小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?如果有,请输出索引和最小的步数组合。
注意:数组中的步数可以重复,但数组中的元素不能重复使用。提供的数据保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。
输入描述
第一行输入为每回合可能连续跳的步数,它是int整数数组类型。实际字符串中整数与逗号间可能存在空格。
第二行输入为房子总格数count,它是int整数类型
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
示例1
输入:
[1,4,5,2,2]
7
输出:
[5, 2]
示例2
输入:
[-1,2,4,9,6]
8
输出:
[-1, 9]
说明:
此样例有多种组合满足两回合跳到最后,比如:[-1,9],[2,6],其中[-1,9]的索引和为0+3=3,[2,6]的索和为1+4=5,所以索引和最小的步数组合[-1,9]
C++
#include <bits/stdc++.h>
using namespace std;
// 解析输入
vector<int> parseSteps(const string &line) {
vector<int> steps;
stringstream ss(line.substr(1, line.size() - 2)); // 去掉方括号
string num;
// 按照逗号分割并读取每个数字
while (getline(ss, num, ',')) {
steps.push_back(stoi(num));
}
return steps;
}
/**
* @author code5bug
*/
int main() {
string line;
getline(cin, line);
vector<int> steps = parseSteps(line);
// 房子总格数
int count;
cin >> count;
string ans = "No solution";
size_t minIndexSum = SIZE_MAX; // 使用 SIZE_MAX 表示没有找到组合
for (size_t i = 0; i < steps.size(); i++) {
for (size_t j = i + 1; j < steps.size(); j++) {
// 找到可以跳到最后一格索引和更小的组合
if (steps[i] + steps[j] == count && i + j < minIndexSum) {
minIndexSum = i + j;
ans = "[" + to_string(steps[i]) + "," + to_string(steps[j]) + "]";
}
}
}
cout << ans << endl;
return 0;
}
题解分析
这道题目是一个典型的组合问题,要求在给定的步数数组
steps
中找到两步的组合,使得跳到最后一格总共的步数恰好等于count
。并且,要求返回的是这两个步数的组合,同时保证其索引和最小。可以将这道题归类为“暴力枚举 + 条件判断”问题。通过遍历所有可能的两个步数组合,计算每个组合的和,如果满足条件(即和等于
count
),则进一步比较它们的索引和,更新答案。解题思路
- 输入解析:将输入的字符串(如
[1, 4, 5, 2, 2]
)解析成一个整数数组steps
。- 暴力枚举:使用两个嵌套的循环来枚举所有的步数组合。在内层循环中,检查两个步数之和是否等于
count
。- 条件判断:如果符合条件(两步之和等于
count
),进一步判断其索引和是否最小。如果是,更新答案。- 返回结果:最后输出符合条件的步数组合,并按照题目要求的格式返回。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏