题意:
有n个格子,第i个格子的颜色为c(i),
给定k,一次操作你可以选择一个长度为k的区间,
这个区间内的每个格子的颜色可以随意修改,
问最少操作多少次,能使得所有格子颜色相同。
数据范围:n<=1e5,1<=c(i)<=100
解法:
观察到只有100种颜色,考虑枚举最后的颜色,
假设颜色为x,从左到右遍历,每次遇到c[i]!=x,就将[i,i+k-1]的所有格子赋值为x,然后令i=i+k继续遍历,
统计操作次数,对所有颜色的操作次数取min就是答案.
算法复杂度O(100*n)
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e6+5;
int a[maxm];
int b[maxm];
int n,k;
signed main(){
int T;cin>>T;
while(T--){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
int ans=n;
for(int c=1;c<=100;c++){
for(int i=1;i<=n;i++)b[i]=a[i];
int cnt=0;
for(int i=1;i<=n;i++){
if(b[i]!=c){
cnt++;
for(int j=i;j<=min(n,i+k-1);j++){
b[j]=c;
}
i=i+k-1;
}
}
ans=min(ans,cnt);
}
cout<<ans<<endl;
}
return 0;
}