华为机试二星题--书籍叠放c++
时间: 2023-08-10 19:01:26 浏览: 62
题目要求:有n本书和h个书堆。一开始所有的书都叠放在不同的书堆中,每个书堆上可以叠放无数本书。将第i本书依次放入书堆中,第i本书的放置位置遵循以下规则:
1. 如果第i-1本书在第j个书堆中,那么第i本书会放在第j个书堆中。
2. 如果第i-1本书在第j个书堆中,那么第i本书会放在第j+1个书堆中。
在放置了n本书以后,问总共需要多少个书堆。
解题思路:根据题意,需要统计当前的书堆数。设置一个变量cur表示当前的书堆数,初始值为1。遍历每一本书,如果当前的书不等于前一本书,则书堆数+1.最后返回书堆数cur。
具体代码如下:
int bookStacking(vector<int>& books) {
int cur = 1;
for (int i = 1; i < books.size(); i++) {
if (books[i] != books[i-1]) {
cur++;
}
}
return cur;
}
相关问题
华为OD机试真题-学生重新排队
华为OD机试真题-学生重新排队是一个典的编程问题,下面是问题和解决路:
问题描述:
有n个学生站成一排,每个学生都有一个独一无二身份ID。现在给定一个初始的学生排列顺序,以及一系列的交换操作,交换操作表示将两个学生的位置进行交换。请你编写一个算法,输出最终的学生排列顺序。
解决思路:
这个问题可以使用数组来表示学生的排列顺序。首先,我们需要根据初始的学生排列顺序构建一个映射表,将每个学生的ID与其在数组中的位置对应起来。然后,我们按照给定的交换操作,更新映射表中学生的位置信息。最后,根据更新后的映射表,构建最终的学生排列顺序。
具体步骤如下:
1. 构建映射表:遍历初始的学生排列顺序,将每个学生的ID与其在数组中的位置对应起来,可以使用哈希表来实现。
2. 执行交换操作:按照给定的交换操作,更新映射表中学生的位置信息。
3. 构建最终的学生排列顺序:根据更新后的映射表,构建最终的学生排列顺序。
下面是一个示例代码,用于解决这个问题:
```python
def rearrange_students(initial_order, swap_operations):
# 构建映射表
mapping = {}
for i, student_id in enumerate(initial_order):
mapping[student_id] = i
# 执行交换操作
for swap in swap_operations:
student1, student2 = swap
mapping[student1], mapping[student2] = mapping[student2], mapping[student1]
# 构建最终的学生排列顺序
final_order = [0] * len(initial_order)
for student_id, position in mapping.items():
final_order[position] = student_id
return final_order
```
使用上述代码,你可以通过传入初始的学生排列顺序和交换操作,得到最终的学生排列顺序。
华为od机试真题-分披萨
分披萨
题目描述
在给定 m个人的情况下,有 n块比萨。每块比萨都有一个分数。我们希望将比萨分配给每个人,使得每个人得分尽可能多。分数可以为 0。
例如,在给定 3 个人和 3 块比萨的情况下,比萨的得分分别为 5, 4, 7,我们可以将比萨分配为: (5)、(4)、(7),以便每个人分别得到 5, 4, 7 分。
给定 m 个人和 n 块比萨,每块比萨的得分以及每个人对比萨的偏好 (可能有中性,喜欢或者讨厌),你的任务是计算每个人得到的最大分数。
输入格式
输入包含多组测试数据。
每组测试数据的第一行包含两个整数 n(1≤n≤1000) 和 m(1≤m≤100) — 分别表示比萨的数量和人数。第二行包含 n 个整数 a1,a2…an(1≤ai≤1000) — 表示每块比萨的分数。接下来的 m 行每行包含 n 个整数 b1,b2…bn(−1≤bi≤1) — 表示每个人喜欢(1),中性(0)或者讨厌(−1)每块比萨。
输入保证对于每组测试数据至少存在一个人喜欢比萨。
当 n = m = 0 时,表示输入结束。
输出格式
对于每组测试数据,输出 m 行。每行包含一个整数,表示每个人得到的最大分数。
样例输入
3 3
5 4 7
1 0 -1
0 1 0
1 0 0
3 3
4 7 8
-1 0 1
1 -1 0
1 0 0
样例输出
5
4
7
4
7
8
```python
# 代码:
while True:
n, m = list(map(int, input().split()))
if n == 0 and m == 0:
break
pizzas = list(map(int, input().split()))
preferences = [list(map(int, input().split())) for _ in range(m)]
scores = [0] * m
for i in range(n):
max_score = 0
for j in range(m):
if preferences[j][i] == 1:
max_score = max(max_score, pizzas[i])
elif preferences[j][i] == 0:
max_score = max(max_score, pizzas[i] // 2)
for j in range(m):
if preferences[j][i] == 1 or (preferences[j][i] == 0 and max_score == pizzas[i] // 2):
scores[j] += max_score
for score in scores:
print(score)
```