C++模拟题[第一周-T2] 开心和哭哭

开心和哭哭

题目描述

小 P 经常忘记回复 Rain 的信息,为了方便,他决定写一个自动回复程序。

Rain 每天会发送若干个表情,每个表情为“哭哭”或者“开心”,其中“哭哭”用 0 0 0 表示,“开心”用 1 1 1 表示。也就是说,她每天发送的表情可以被表示为一个 01 01 01 串。

你需要以如下方式计算 Rain 每天的心情值并输出它们:

  1. 心情值为每天有效的开心表情数量减有效的哭哭表情数量;
  2. 如果 Rain 连续发了大于等于三个相同表情,那么这些表情被计算为一个有效表情。对于其他情况,所有发送的表情均为有效表情。

例:对于发送的表情 011100,Rain 的心情值为 − 2 -2 2。可以注意到她连续发送了三个开心表情,它们只需被计算一次。

输入格式

第一行输入一个数字 t t t,代表需要计算的天数。

之后的 t t t 行中,每行一个数 s i s_i si 与一个 01 01 01 串,其中 s i s_i si 代表 01 01 01 串的长度。 01 01 01 串意义同题意。

输出格式

输出 t t t 行,每行一个整数代表 Rain 的心情值。

样例 #1

样例输入 #1

3
6 011100
7 1111000
4 1011

样例输出 #1

-2
0
2

提示

分值 t t t ∑ s i \sum s_i si特殊性质
10 ≤ 100 \le 100 100 ≤ 1 0 5 \le 10^5 105A
20 ≤ 100 \le 100 100 ≤ 1 0 5 \le 10^5 105B
30 ≤ 1 \le 1 1 ≤ 1000 \le 1000 1000
40 ≤ 100 \le 100 100 ≤ 1 0 5 \le 10^5 105

特殊性质 A:给出的 01 01 01 串均满足 01 01 01 交替出现;
特殊性质 B:给出的 01 01 01 串均满足 000 000 000 111 111 111 交替出现;

对于所有数据满足: 1 ≤ t ≤ 100 1\le t\le 100 1t100 1 ≤ ∑ s i ≤ 1 0 5 1\le \sum s_i\le 10^5 1si105

注: ∑ s i \sum s_i si 代表所有 s i s_i si 之和。

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值