代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+9;//N很大,向外面要内存
int main()
{
int t;
cin>>t;//输入测试用例个数
//注意这是最外层循环:用于遍历测试用例
while(t!=0)
{//之后的执行基本都在while内发生,尽量定义在while内(for外),否则容易出bug
int n,k;
int leastday=N;//最后会在min函数中被赋新值
set<int>myset;//只保存不重复的数据,用于之后枚举"选择哪个数覆盖"
cin>>n>>k;//输入房间数和区间
int a[N];
//注意这是遍历循环,仅作输入
for(int i=0;i<n;++i)
{
cin>>a[i];//将原始数据保留在数组中用于遍历
myset.insert(a[i]);//原始数据插入进集合中
}
//举例122333,k=2,开始枚举,每次循环枚举得到的day都不一样
//"1"111111 ->3天,day=3
//"2"222222 ->3天,day=3
//"3"333333 ->2天,day=2
//注意这是外层循环:利用set集合中的不重复元素作为枚举对象
for(auto x:myset)
{
int day=0;
//注意这是内层循环:遍历数组中每一个原始数据
//采用x将不为x的数覆盖为x,一次只能覆盖k个(k=2)
//若j=2时数组中的数据不为x,就要从j=2开始覆盖,直到j+k-1时结束,说明每次覆盖两k(k=2)个数(a[2],a[3])
for(int j=0;j<n;++j)//122333
{
if(x==a[j])
{
continue;//结束内层循环中当前循环,开始下一个循环//(1)22333 -> 1(2)2333
}
else
{
j=j+k-1;
day++;//覆盖一次k区间,天数加1
}
}
leastday=min(leastday,day);//每次循环都更新的day,leastday也就因为min函数赋值而随之更新
//最后遍历结束时,min函数会将最后得出的最小的天数赋值给leastday
}
cout<<leastday<<endl;//由于有t个测试用例,那么输出的结果也会有t次,所以买while循环内输出
t--;//测试用例用完后会自动跳出循环
}
return 0;
}