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;
}

浙公网安备 33010602011771号