洛谷P2882

P2882 [USACO07MAR] Face The Right Way G

好难啊~

点击查看代码
#include<bits/stdc++.h> 
using namespace std;

int main() {
    int n; cin >> n;
    vector<int> a(n + 1), flip(n + 2);
    //a记录原状态,flip用作差分记录对应牛的翻转次数
    for(int i = 1; i <= n; i++) {
        char c; cin >> c;
        a[i] = (c == 'B') ? 1 : 0;
    }

    int min_k = 1, min_ops = n + 1;
    //最大值假设所有牛都需要翻转,每次翻转一头牛
    for(int k = 1; k <= n; k++) {
        memset(&flip[0], 0, sizeof(int) * (n + 2));
        //每次翻转长度变化时,重组差分翻转数组
        int ops = 0, sum = 0;
        bool valid = 1;
        

        for(int i = 1; i <= n; i++) {
            sum += flip[i];//差分求a_i实际翻转次数
            if((a[i] + sum) % 2 != 0) {//当a_i朝后
                
                if(i + k - 1 > n) {
                    valid = 0;
                    break;
                }
                //若当前到队尾未满k头牛则无法翻转
                
                ops++;
                flip[i]++;
                flip[i + k]--;
                sum++;
                //能翻转就更新状态
            }
        }

        if(valid && ops < min_ops) {
            min_ops = ops;
            min_k = k;
        }
        //更新答案
    }
    cout << min_k << ' ' << min_ops << '\n';
    return 0;
}
posted @ 2025-05-19 16:25  Chuan81  阅读(14)  评论(0)    收藏  举报