25年1月-A组(萌新)- 云朵工厂
题目描述
世界各地的云朵都是由知名的云朵工厂克劳德生产的。
工厂的流水线正在加班加点的生产各种不同的云朵,不同种类的云朵会用不同的字母表示,云朵储备管道内目前已经有 N 朵云朵,工人们正在对其进行打包并分发到各个地区。同种类的云朵可以打包到一个打包袋,但是为了保证打包的密闭性,当管道中的下一朵为不同种类的云朵时,就必须把当前的打包袋封装起来,且不能再打开。
请帮工长计算一下一共需要多少个打包袋?
输入
第一行输入整数 N,表示云朵的数量。
第二行输入一个字符串 S,记录了云朵的种类。
输出
输出一个整数,表示打包袋的数量。
样例
输入
10
aaacccaaaddd
输出
4
输入
6
bbbbbb
输出
1
输入
20
xxzaffeeeeddfkkkkllq
输出
10
说明
样例 1 解释
这些云朵会被打包为 4 份,分别为 aaa、ccc、aaa、ddd 这 4 份。
样例 2 解释
所有云朵被打包为 1 份。
数据规模
有 20% 的数据,满足 1≤N≤10,且所有小写字母互不相同。
对于 100% 的数据,满足 1≤N≤10^5 ,且 S 仅由小写英文字母组成。
分析
为了计算云朵的打包袋数量,我们可以通过遍历给定的字符串(代表云朵的种类)来实现。我们的主要目标是统计字符串中相邻不同字符的数量,换句话说,我们要找出云朵种类的变化点。每当我们遇到一个不同的字符时,就意味着我们需要一个新的打包袋。
下面是具体的实现步骤:
- 初始化一个计数器,用于记录打包袋的数量。
- 遍历字符串,比较当前字符与前一个字符:
- 如果当前字符与前一个字符不同,则增加打包袋的计数。
- 最后输出计数器的值。
代码
以下是 C++ 的实现代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
int N; // 云朵的数量
cin >> N; // 输入数量
string S; // 云朵种类字符串
cin >> S; // 输入云朵种类
if (N == 0) {
cout << 0 << endl; // 如果没有云朵,打包袋数量为0
return 0;
}
int bag_count = 1; // 至少需要一个打包袋
for (int i = 1; i < N; ++i) {
if (S[i] != S[i - 1]) { // 如果当前字符与前一个字符不同
bag_count++; // 增加打包袋计数
}
}
cout << bag_count << endl; // 输出打包袋的数量
return 0;
}
代码解释
- 输入处理:
- 读取云朵数量
N
和云朵种类的字符串S
。
- 读取云朵数量
- 计算打包袋数量:
- 初始化
bag_count
为 1,因为至少需要一个袋子来装第一种云朵。 - 遍历从第二个字符到最后一个字符,检查是否与前一个字符不同:
- 如果不同,增加打包袋的数量。
- 初始化
- 输出结果:
- 最后输出打包袋的数量。
时间复杂度
这个方法的时间复杂度为 O(N),其中 N 是云朵的数量,这在给定的约束条件下是高效的。