• AcWing 5147. 数量 + 5148. 字符串匹配 - 思维+字符串处理


    5147. 数量

    这个题是之前某场周赛第三题的中间一个步骤
    这里我选择使用递归,因为数据范围是1e9,所以当传入的数字位数超过9为时,即可终止递归。这里只需要传入一个参数dep来表示当前数字有多少位就可以。
    但是在这之前,我并没有传入dep参数,我是在递归函数里直接使用的if条件来进行判断,if(x*10+4 <= 1e9) 但是这样的时候,当数据是444444444时就会进入死循环,在这之后我尝试把 if 两边的数字强制转换为long long,但是还是进行死循环。(这个原因的话我猜应该还是精度的问题,但是今天我的鼠标有点问题,所以后来直接多传入了一个参数,具体的原因等之后我再研究研究吧QAQ)
    AC代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    #define ll long long
    #define sf(x) scanf("%d", &x);
    #define de(x) cout << x << " ";
    #define Pu puts("");
    const int N = 5e3 + 9;
    int a[N];
    int n, m, ans;
    int cnt;
    void fun(int x, int dep) {
        if (dep > 9)
            return;
        a[++cnt] = x * 10 + 4;
        fun(x * 10 + 4, dep + 1);
    
        a[++cnt] = x * 10 + 7;
        fun(x * 10 + 7, dep + 1);
    }
    int main() {
        cin >> n;
        fun(0, 1);
        int i = 1;
        sort(a + 1, a + cnt + 1);
        while (i <= cnt) {
            if (a[i] > n)
                break;
            i++;
        }
        cout << (i - 1);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    5148. 字符串匹配

    这个题目因为说需要在满足第一个条件的基础下再尝试着不考虑大小写进行匹配。
    因此直接用数组记录a-z,A-Z出现的次数
    然后遍历s字符串中的每一个字符,这里我们只需要使用0-25的for循环就可以,一是我们已经记录了每个字符出现的字数,二是字符串是只含有小写或者大写字母的。
    如果当前t中含有这个字符,那么直接加上这个字符的数量就是最优。
    在上面一步完成后,我们再进行一次上面的循环,如果s中的当前字符为小写字母,那么我们直接去t中找对应的大写字母
    如果s中的当前字符为大写字符,那么我们直接去t中找对应的小写字母
    这个题目并不是很难,重要的是对一些细节的处理吧

    #include 
    using namespace std;
    #define ll long long
    #define sf(x) scanf("%d", &x);
    #define de(x) cout << x << " ";
    #define Pu puts("");
    const int N = 2e5 + 9, mod = 1e9 + 7;
    int n, m, ans;
    char s[N], t[N];
    int a[N], b[N];
    int main() {
        scanf("%s%s", s, t);
        n = strlen(s);
        m = strlen(t);
        for (int i = 0; i < n; i++) {
            a[(s[i] - 'A')]++;
        }
        for (int i = 0; i < m; i++) {
            b[(t[i] - 'A')]++;
        }
        int an1 = 0, an2 = 0;
        int k;
        for (int i = 0; i < 26; i++) {
            k = (i + 'A') - 'A';  // 大写字母
            if (a[k]) {
                if (b[k] >= a[k]) {
                    b[k] -= a[k];
                    an1 += a[k];
                    a[k] = 0;
                } else {
                    a[k] -= b[k];
                    an1 += b[k];
                    b[k] = 0;
                }
            }
            k = (i + 'a' - 'A');  // 小写字母
            if (a[k]) {
                if (b[k] >= a[k]) {
                    b[k] -= a[k];
                    an1 += a[k];
                    a[k] = 0;
                } else {
                    a[k] -= b[k];
                    an1 += b[k];
                    b[k] = 0;
                }
            }
        }
        int k1;
        for (int i = 0; i < 26; i++) {
            k1 = (i + 'A') - 'A';  // 大写字母
            k = k1 + 32;
            if (a[k1]) {
                if (b[k] >= a[k1]) {
                    b[k] -= a[k1];
                    an2 += a[k1];
                    a[k1] = 0;
                } else {
                    a[k1] -= b[k];
                    an2 += b[k];
                    b[k] = 0;
                }
            }
            k1 = (i + 'a' - 'A');  // 小写字母
            k = k1 - 32;
            if (a[k1]) {
                if (b[k] >= a[k1]) {
                    b[k] -= a[k1];
                    an2 += a[k1];
                    a[k1] = 0;
                } else {
                    a[k1] -= b[k];
                    an2 += b[k];
                    b[k] = 0;
                }
            }
        }
        cout << an1 << " " << an2;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
  • 相关阅读:
    企业工程项目管理系统源码-专注项目数字化管理-Java工程管理
    IDA Pro正版多少钱?本文告诉你!
    深度学习远程炼丹:一文离线完成ubuntu+docker+pycharm环境配置
    C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.2 while语句
    idea引入MybatisPlus,其中mapper文件中的方法提示 @MapKey is required
    nginx出现504 Gateway Time-out错误的原因分析及解决
    【Java】 java | nacos | nacos使用注意事项
    《docker高级篇(大厂进阶):6.Docker轻量级可视化工具Portainer》
    矩阵存储和特殊矩阵的压缩存储
    NFT艺术品交易平台有哪些?
  • 原文地址:https://blog.csdn.net/weixin_52490191/article/details/132863516