Silver: Hoof, Paper, Scissor S

P3609 USACO17JAN] Hoof, Paper, Scissor G

这个银组的话很简单,维护三个前缀和,然后枚举每一个时刻作为唯一一次变换手势的时间点就可以了。

代码:

/*
 * Created by: Friedforks
 * Date: 2024-11-12
 */
#include <bits/stdc++.h>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> paper(n + 1), hoof(n + 1), scissor(n + 1);
    char c;
    for (int i = 1; i <= n; i++) {
        cin >> c;
        // keep track of the number of each type of move
        paper[i] = paper[i - 1];
        hoof[i] = hoof[i - 1];
        scissor[i] = scissor[i - 1];
        // update the number of each type of move
        switch (c) {
        case 'P':
            paper[i]++;
            break;
        case 'H':
            hoof[i]++;
            break;
        case 'S':
            scissor[i]++;
            break;
        }
    }

    int ans = 0;
    for (int i = 1; i <= n; i++) {
        int win[2][3] = {
            {paper[i] - paper[0], hoof[i] - hoof[0], scissor[i] - scissor[0]},
            {paper[n] - paper[i], hoof[n] - hoof[i], scissor[n] - scissor[i]}};
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                if (j != k) {
                    ans = max(ans, win[0][j] + win[1][k]);
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}