AcWing第19场周赛题解

A. 3991. 满足条件的01串

题目链接:https://www.acwing.com/problem/content/3994/

题目大意:略。

解题思路:简单模拟一遍即可。

示例程序:

#include <bits/stdc++.h>
using namespace std;
int T, n;
char s[1010];

bool check() {
    for (int i = 2; s[i]; i++)
        if (s[i-1] == '1' && s[i] == '1')
            return false;
    for (int i = 1; s[i]; i++)
        if (s[i] == '0' && !(s[i-1] == '1' || s[i+1] == '1'))
            return false;
    return true;
}

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> s+1;
        puts(check() ? "Yes" : "No");
    }
    return 0;
}

B. 3992. 树上有猴

题目链接:https://www.acwing.com/problem/content/3995/

题目大意:略。

解题思路:设初始数量为 0,求最大值和最小值,根据偏移求结果。

示例程序:

#include <bits/stdc++.h>
using namespace std;

int n, w, a, tmp, mx, mi;

int main() {
    cin >> n >> w;
    while (n--) {
        cin >> a;
        tmp += a;
        mx = max(mx, tmp);
        mi = min(mi, tmp);
    }
    cout << max(0, w - (mx - mi) + 1) << endl;
    return 0;
}

C. 3993. 石子游戏

题目链接:https://www.acwing.com/problem/content/3996/

题目大意:

解题思路:桶,贪心。因为数据范围是 \(2 \times 10^5\),所以可以开一个同记录一下每个数值出现地次数,然后贪心去消。计数需要对差分前缀和。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;

int n, k, h, a, cnt[maxn];

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> a;
        h = max(h, a);
        cnt[a]++;
    }
    for (int i = h-1; i >= 1; i--)
        cnt[i] += cnt[i+1];
    assert(cnt[1] == n);
    int tmp = 0, cc = 0;
    while (cnt[h] < n) {
        if (tmp < cnt[h]) {
            cc++;
            tmp = k;    // 这里一开始写成 += 了但其实是 =
        }
        tmp -= cnt[h--];
    }
    cout << cc << endl;
    return 0;
}
posted @ 2022-04-11 18:33  quanjun  阅读(19)  评论(0编辑  收藏  举报