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;
}

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;
}

你可能感兴趣的:(刷题+算法,AcWing,#,思维+模拟,算法)