开心和哭哭
题目描述
小 P 经常忘记回复 Rain 的信息,为了方便,他决定写一个自动回复程序。
Rain 每天会发送若干个表情,每个表情为“哭哭”或者“开心”,其中“哭哭”用 000 表示,“开心”用 111 表示。也就是说,她每天发送的表情可以被表示为一个 010101 串。
你需要以如下方式计算 Rain 每天的心情值并输出它们:
- 心情值为每天有效的开心表情数量减有效的哭哭表情数量;
- 如果 Rain 连续发了大于等于三个相同表情,那么这些表情被计算为一个有效表情。对于其他情况,所有发送的表情均为有效表情。
例:对于发送的表情 011100,Rain 的心情值为 −2-2−2。可以注意到她连续发送了三个开心表情,它们只需被计算一次。
输入格式
第一行输入一个数字 ttt,代表需要计算的天数。
之后的 ttt 行中,每行一个数 sis_isi 与一个 010101 串,其中 sis_isi 代表 010101 串的长度。010101 串意义同题意。
输出格式
输出 ttt 行,每行一个整数代表 Rain 的心情值。
样例 #1
样例输入 #1
3
6 011100
7 1111000
4 1011
样例输出 #1
-2
0
2
提示
| 分值 | ttt | ∑si\sum s_i∑si | 特殊性质 |
|---|---|---|---|
| 10 | ≤100\le 100≤100 | ≤105\le 10^5≤105 | A |
| 20 | ≤100\le 100≤100 | ≤105\le 10^5≤105 | B |
| 30 | ≤1\le 1≤1 | ≤1000\le 1000≤1000 | 无 |
| 40 | ≤100\le 100≤100 | ≤105\le 10^5≤105 | 无 |
特殊性质 A:给出的 010101 串均满足 010101 交替出现;
特殊性质 B:给出的 010101 串均满足 000000000 与 111111111 交替出现;
对于所有数据满足:1≤t≤1001\le t\le 1001≤t≤100,1≤∑si≤1051\le \sum s_i\le 10^51≤∑si≤105。
注:∑si\sum s_i∑si 代表所有 sis_isi 之和。
AC代码:
#include <iostream>
#include <string>
using namespace std;
int calculateMood(const string &str) {
int mood = 0;
int count = 1; // 第一个字符
for (int i = 1; i < str.length(); i++) {
if (str[i] == str[i - 1]) {
count++;
} else {
if (count >= 3) {
mood += (str[i - 1] == '0') ? -1 : 1;
} else {
mood += (str[i - 1] == '0') ? -count : count;
}
count = 1; // 为新字符重置计数
}
}
// 处理连续字符的最后一个组
if (count >= 3) {
mood += (str.back() == '0') ? -1 : 1;
} else {
mood += (str.back() == '0') ? -count : count;
}
return mood;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
string str;
cin >> n >> str;
int mood = calculateMood(str);
cout << mood << endl;
}
return 0;
}
本文描述了一个编程问题,要求编写一个程序来计算Rain每天的心情值,基于她发送的哭哭(0)和开心(1)表情,考虑连续表情只计算一次。输入是一个01串,输出对应的心情值。

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



