B3946 [语言月赛 202403] 2014

题目传送门

思路:

1. 统计字符数量

首先,我们需要统计字符串中每个字符(从'0'到'9')的出现次数。这可以通过遍历字符串并使用一个大小为10的数组来实现,数组的每个位置对应一个数字,存储该数字在字符串中出现的次数。

2. 检查2014串的形成条件

一个有效的2014串是由若干个"2014"子串拼接而成的。因此,我们需要检查字符串中'2'、'0'、'1'和'4'的数量是否满足以下条件:

  • 字符串中'2'的数量必须等于'0'的数量,且等于'1'的数量,且等于'4'的数量。
  • 这些字符的数量必须是4的倍数,因为每个"2014"子串的长度是4。

3. 模拟交换操作

虽然题目允许任意多次交换操作,但实际上我们不需要具体模拟每一步交换操作。只要字符串中'2'、'0'、'1'和'4'的数量满足上述条件,我们就可以断定可以通过交换操作将字符串变成2014串。

4. 判断结果

根据上述分析,如果字符串中'2'、'0'、'1'和'4'的数量满足条件,则输出"Yes";否则输出"No"。

具体实现步骤

  1. 输入字符串长度和字符串:读取输入的整数n和字符串S
  2. 统计字符数量:遍历字符串S,统计每个字符的出现次数。
  3. 检查2014串的形成条件:检查'2'、'0'、'1'和'4'的数量是否满足上述条件。
  4. 输出结果:根据检查结果输出"Yes"或"No"。

代码&解释:

c++代码:

#include<iostream>
using namespace std;

int n;
int two = 0,zero = 0,one = 0,four = 0;
string str;

int main(){
    cin >> n;
    cin >> str;

    for(int i = 0;i < str.size();i++){
        if(str[i] != '2' && str[i] != '0' && str[i] != '1' && str[i] != '4'){
            cout<<"No"<<endl;
            return 0;
        } else if(str[i] == '2') two++;
        else if(str[i] == '0') zero++;
        else if(str[i] == '1') one++;
        else if(str[i] == '4') four++;
    }

    if(two == n / 4 && zero == n / 4 && one == n / 4 && four == n / 4) cout<<"Yes"<<endl;
    else cout << "No" << endl;
    return 0;
}

代码解释:

  1. 引入库和命名空间

    • 使用输入输出流库,方便进行数据的输入和输出。
  2. 变量声明

    • 定义变量n来存储字符串的长度。
    • 计数变量用于分别记录字符'2'、'0'、'1'和'4'在字符串中出现的次数。
    • 定义一个字符串变量用于存储输入的实际字符串。
  3. 输入操作

    • 从输入中读取字符串的长度及该字符串的内容。
  4. 遍历字符串

    • 使用循环逐个检查字符串中的字符。
    • 如果遇到非'2'、'0'、'1'、'4'的字符,立即输出"No"并结束程序,以确保字符串只包含这些特定字符。
    • 根据当前字符更新对应的计数值。
  5. 检查计数

    • 在遍历结束后,判断四个计数是否都等于字符串长度的1/4。只有在所有字符满足这个条件时,才能形成一个或多个完整的"2014"子串。
    • 根据判断结果输出相应的"Yes"或"No"。

Python代码:

n = int(input())
s = input()

count = {'2': 0, '0': 0, '1': 0, '4': 0}

for char in s:
    if char in count:
        count[char] += 1
    else:
        print("No")
        exit()

# 检查每个字符的数量是否都是n/4
if count['2'] == n / 4 and count['0'] == n / 4 and count['1'] == n / 4 and count['4'] == n / 4:
    print("Yes")
else:
    print("No")

代码解释:

  1. 输入操作

    • 使用input()函数读取字符串的长度和内容。
  2. 字符计数

    • 使用字典count来记录'2'、'0'、'1'和'4'的出现次数。
    • 遍历字符串中的每个字符,更新对应的计数。如果遇到非这些字符的字符,立即输出"No"并退出程序。
  3. 检查条件

    • 在遍历结束后,检查每个字符的计数是否等于字符串长度的1/4。
    • 如果满足条件,输出"Yes";否则输出"No"。

Pascal代码(现打的,仅供参考):

program Check2014String;

var
    n: Integer;
    s: string;
    count2, count0, count1, count4: Integer;
    i: Integer;

begin
    readln(n);
    readln(s);

    count2 := 0;
    count0 := 0;
    count1 := 0;
    count4 := 0;

    for i := 1 to n do
    begin
        if s[i] = '2' then
            count2 := count2 + 1
        else if s[i] = '0' then
            count0 := count0 + 1
        else if s[i] = '1' then
            count1 := count1 + 1
        else if s[i] = '4' then
            count4 := count4 + 1
        else
        begin
            writeln('No');
            exit;
        end;
    end;

    // 检查是否能够形成完整的"2014"子串
    if (n mod 4 = 0) and (count2 = n div 4) and 
       (count0 = n div 4) and (count1 = n div 4) and 
       (count4 = n div 4) then
        writeln('Yes')
    else
        writeln('No');
end.

代码解释:

  1. 输入长度

    • 需要确保输入的长度n是4的倍数,否则字符串不可能被分解成完整的"2014"子串。因此增加了n mod 4 = 0的检查。
  2. 计数逻辑

    • 计数部分保持不变,它会统计'2'、'0'、'1'和'4'的出现次数。
  3. 最终判断

    • 如果字符的数量满足条件,并且n是4的倍数,则可以构成多个"2014"子串,输出"Yes";否则输出"No"。

希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻题解,神犇勿喷,点个赞再走吧!QAQ
  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值