1 条题解

  • 0
    @ 2022-12-27 18:44:28

    前缀和。

    pip_i 为前 i(1in)i(1 \le i \le n) 个数中 22 的数量,qiq_i 为前 i(1in)i(1 \le i \le n) 个数中 11 的数量。

    那么,(qnqi1)(q_n - q_{i - 1}) 就是后 nin - i 个数中 11 的数量。

    考虑以 ii 为分界,求最小值,那么 pi+(qnqi1)p_i + (q_n - q_{i - 1}) 即为以 ii 为分界,需要改变的数量。

    #include "bits/stdc++.h"
    using namespace std;
    
    int p[1919810], q[1919810];
    int x[1919810];
    
    int minn = 0x3f3f3f3f;
    
    int main() {
        int n;
        scanf ("%d", &n);
        for (int i = 1; i <= n; ++i) scanf ("%d", &x[i]);
        for (int i = 1; i <= n; ++i) {
            p[i] = p[i - 1] + (x[i] == 2);
            q[i] = q[i - 1] + (x[i] == 1);
        }
        for (int i = 1; i <= n; ++i) {
            int s1 = p[i - 1], s2 = q[n] - q[i - 1];
            // cout<<s1<<' '<<s2<<' '<<i<<endl;
            minn = min(minn, s1 + s2);
        }
        minn = min(minn, p[n]);
        printf ("%d\n", minn);
    
    }
    
    • 1

    信息

    ID
    265
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    31
    已通过
    18
    上传者