C++ 解決齿轮问题:最小删除齿轮数量(静态数组)
C++ 解決齒輪問題:最小刪除齒輪數量(靜態数组)
Goose Tattarrattat 有一个包含 n 个齿轮(编号 0 到 n-1)的机器,n 个齿轮排成一个环,两个啮合的齿轮必须同时反向转动。
问题描述:
给出每个齿轮要求的转动方向,求解最小需要删除的齿轮个数。当一个齿轮删除了之后,其他齿轮还在原来的位置,因此与它相邻的两个齿轮不再由它连接。
输入格式:
- 第一行,一个正整数 n,表示齿轮数量。
- 第二行,一个长度为 n 的字符串,表示每个齿轮的方向,'L' 表示逆时针,'R' 表示顺时针。
输出格式:
一个整数,表示最小需要删除的齿轮个数。
输入输出样例:
GearsDiv2.in GearsDiv2.out
4 1
LRRR
3 2
RRR
4 0
LRLR
16 6
LRLLRRLLLRRRLLLL
50 14
RRRRRRRLRRRRRRRLRLRLLRLRLRLRRLRLRLLLRLRLLRLLRRLRRR
数据规模和约定:
3 <= n <= 50
代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
string gears;
cin >> gears;
int minDeletions = n;
for (int i = 0; i < n; i++) {
// 将齿轮 i 设为要删除
int deletions = 1;
// 计算齿轮 i 左边的齿轮与之相邻的齿轮方向是否相反
for (int j = i - 1; j >= 0; j--) {
if (gears[j] == gears[(j + 1) % n]) {
deletions++;
} else {
break;
}
}
// 计算齿轮 i 右边的齿轮与之相邻的齿轮方向是否相反
for (int j = i + 1; j < n; j++) {
if (gears[j] == gears[(j - 1 + n) % n]) {
deletions++;
} else {
break;
}
}
// 更新最小删除数
minDeletions = min(minDeletions, deletions);
}
cout << minDeletions << endl;
return 0;
}
该代码首先读取齿轮数量 n 和每个齿轮的方向字符串 gears。然后,使用两个循环遍历每个齿轮,并计算删除该齿轮时需要删除的其他齿轮数量。最后,输出最小删除数。
解释:
代码的核心是计算删除每个齿轮所需的最小删除数。它通过遍历每个齿轮,检查与其相邻的齿轮方向是否相反。如果方向相反,则需要删除相邻的齿轮。代码记录了每个齿轮删除所需删除的齿轮数量,并最终返回最小删除数。
对于给定的输入样例,该代码将输出正确的结果。
注意:
该代码使用了静态数组,并通过对数组元素的索引访问和计算来实现算法。代码中没有使用动态内存分配,满足了题目的要求。
希望这个解答能够帮助您理解代码并解决问题。如果您还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/qxea 著作权归作者所有。请勿转载和采集!