正经题解|千纸鹤
2026-05-22 20:12:36
发布于:河北
1阅读
0回复
0点赞
算法思路: 这是一个贪心算法问题。目标是用最少的操作次数覆盖所有值为1的位置。每次遇到未被覆盖的1时,就从该位置开始进行一次操作,覆盖接下来的k个位置,这样可以最大化每次操作的效益。
时间复杂度:O(n)
空间复杂度:O(n)
代码演示:
#include<iostream>
#include<vector>
using namespace std;
int main(){
// 取消cin/cout与stdio的同步,提高输入输出效率
ios::sync_with_stdio(false);
// 解除cin与cout的绑定,进一步优化输入输出速度
cin.tie(nullptr);
cout.tie(nullptr);
int n=0,k=0; // n表示数组长度,k表示每次操作能覆盖的范围
cin>>n>>k;
vector<int> c(n); // 创建大小为n的数组,存储每个位置的状态(0或1)
for(int i=0;i<n;++i) cin>>c[i]; // 输入数组元素
int operations=0; // 记录操作次数
int covered_until=-1; // 记录当前已经覆盖到的最远位置
// 遍历数组中的每个位置
for(int i=0;i<n;++i){
// 如果当前位置是1(需要被覆盖)且还没有被之前的操作覆盖到
if(c[i]==1 && i>covered_until){
operations++; // 增加一次操作
// 更新覆盖范围:从当前位置开始向右覆盖k个位置,但不超过数组边界
covered_until = min(n-1, i+k-1);
}
}
cout<<operations; // 输出最少操作次数
return 0;
}
这里空空如也








有帮助,赞一个