cf1209 G1. Into Blocks (easy version)

题意:

求最少代价,把数组变成形如 1 1 3 3 3 2 的形式,即相同数字放一块。

每次操作选择某值 x,花费 cnt[x] 把所有 x 都变成另一个整数 y

思路:

贪心,每次处理区间 [l,r],区间中的每个数的所有 appearance 都在区间中,把区间中的其他数都变成区间中出现次数最多的数

int n, k, a[N], c[N], p[N], ans;

signed main() {
    iofast;
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
        cin >> a[i], c[a[i]]++, p[a[i]] = i;
    for(int l = 1, r = p[a[l]]; l <= n; l = r + 1, r = p[a[l]]) {
        int m = 0; //找众数
        for(int i = l; i <= r; r = max(r, p[a[i]]), i++)
            m = max(m, c[a[i]]);
        ans += r - l + 1 - m;
    }
    cout << ans;
}

posted @ 2022-03-31 10:11  Bellala  阅读(68)  评论(0)    收藏  举报