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

本文描述了一个编程问题,要求编写一个程序来计算Rain每天的心情值,基于她发送的哭哭(0)和开心(1)表情,考虑连续表情只计算一次。输入是一个01串,输出对应的心情值。

开心和哭哭

题目描述

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

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

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

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

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

输入格式

第一行输入一个数字 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_isi特殊性质
10≤100\le 100100≤105\le 10^5105A
20≤100\le 100100≤105\le 10^5105B
30≤1\le 11≤1000\le 10001000
40≤100\le 100100≤105\le 10^5105

特殊性质 A:给出的 010101 串均满足 010101 交替出现;
特殊性质 B:给出的 010101 串均满足 000000000111111111 交替出现;

对于所有数据满足:1≤t≤1001\le t\le 1001t1001≤∑si≤1051\le \sum s_i\le 10^51si105

注:∑si\sum s_isi 代表所有 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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值