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

5147. 数量

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

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
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;
}

5148. 字符串匹配

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

#include <bits/stdc++.h>
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值