蓝桥OJ(3272) 小蓝的漆房 C++ 超详解

9d230bdab3d5476c80a1bdd3a7e5adef.png

849dc110c8f74421aef4c296b2f7bd2f.png 

7daddd7adf274d9289565b515dc37ff0.png 

c185e6b68e804688b684d2926bf66dfa.png 

1943861b50a1404a8313a5bc2d55f1b4.png 

代码如下:

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

}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值