B3935[语言月赛202402]数字串

· · 题解

本蒟蒻是第一次写题解,麻烦各位dalao见谅OTZ

这题难度为普及-, 中心为字符串入门,没有掌握的同学可以再巩固巩固

这题给定t组数据,每组给出n, m, s三个量, 分别表示序列号、字符串长度以及字符串, 总结下来字符串只有三种可能

  1. 字符串只有一个数字1
  2. 字符串有多个数字1
  3. 字符串没有数字1

我们一一来解决一下这三个问题:

bool checka(string s, int m, int n){//检查唯一一个1的左右两边是否合规
    int a = 0;
    for (int i = 0; i < m; i ++ ){
        if (s[i] == '1'){
            if (a > n) return 0;
            a = 0;
        }
        else a ++ ;
    }
    if (a > n) return 0;
    return 1;
}
bool checkb(string s, int m, int n){//检查有多个1每个区间是否合规
    int  a[100010] = {0}, d = 0;
    for (int i = 0; i < m; i ++ ){
        if (s[i] == '1') d ++ ;
        else a[d] ++ ;
    }
    if (s[m - 1] == '0') d ++ ;
    for (int i = 1; i < d - 2; i ++ ){
        if (a[i] != a[i + 1]) return 0;
    }
    if (a[0] <= a[1] && a[d - 1] <= a[1] && a[1] <= n) return 1;
    return 0;
}
bool checkc(string s, int m, int n){
    if (m <= n) return 1;
    return 0;
}

欧克,到这里思路就已经讲完了,请有动手能力的人自己重构一下代码,脑子懂了手没懂的可以继续往下看

完整代码如下:

#include <iostream>
using namespace std;
int n, m, t;
string s;
int check1(string s, int l){//检查1的个数
    int sum = 0;
    for (int i = 0; i < l; i ++ ){
        if (s[i] == '1') sum ++ ;
    }
    return sum;
}
bool checka(string s, int m, int n){//检查唯一一个1的左右两边是否合规
    int a = 0;
    for (int i = 0; i < m; i ++ ){
        if (s[i] == '1'){
            if (a > n) return 0;
            a = 0;
        }
        else a ++ ;
    }
    if (a > n) return 0;
    return 1;
}
bool checkb(string s, int m, int n){//检查有多个1每个区间是否合规
    int  a[100010] = {0}, d = 0;
    for (int i = 0; i < m; i ++ ){
        if (s[i] == '1') d ++ ;
        else a[d] ++ ;
    }
    if (s[m - 1] == '0') d ++ ;
    for (int i = 1; i < d - 2; i ++ ){
        if (a[i] != a[i + 1]) return 0;
    }
    if (a[0] <= a[1] && a[d - 1] <= a[1] && a[1] <= n) return 1;
    return 0;
}
bool checkc(string s, int m, int n){
    if (m <= n) return 1;
    return 0;
}
int main(){
    cin >> t;
    while (t -- ){
        cin >> n >> m >> s;
        if (check1(s, m) == 1){//一个1
            if (checka(s, m, n)) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
        else if (check1(s, m) > 1){//多个1
            if (checkb(s, m, n)) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
        else{//没有1
            if (checkc(s, m, n)) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
}

如果还没看懂的话,可以多看几遍

各位看了蒟蒻的代码后有什么简化建议可以告诉作者,非常感谢你看到了这里欢迎互关,我是第一次发题解,若有没读懂的,可以在评论区问,~我会尽量讲明白~

再见咯~