简单的前缀和
灯能亮,用1表示,灯不亮,用0表示。 a[x] 表示第x盏灯能否亮, c 数组是 a数组的前缀和
然后暴力遍历,长度为 k 的灯的总和 s(k), 题目所求就是 min{k - s(k)}
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MaxN = 100000 + 10;
int n, k, b;
int a[MaxN], c[MaxN];
void solve()
{
for(int i = 1; i <= n; ++i)
{
c[i] = c[i - 1] + a[i]; //前缀和
}
int repair_cnt = MaxN; //最少需要修复的数量
for(int i = 1; i + k - 1 <= n; ++i)
{
repair_cnt = min(repair_cnt, k - (c[i + k - 1] - c[i - 1]));
}
printf("%d\n", repair_cnt);
}
int main()
{
int x;
scanf("%d%d%d", &n, &k, &b);
for(int i = 1; i <= n; ++i)
{
a[i] = 1;
}
while(b--)
{
scanf("%d", &x);
a[x] = 0;
}
solve();
return 0;
}
/*
10 6 5
2
10
1
5
9
*/
/*
1
*/
这篇博客介绍了如何利用前缀和解决一道名为"Why Did the Cow Cross the Road II"的问题。文章指出,对于灯泡状态的表示,1代表灯亮,0代表灯不亮,通过计算a数组的前缀和c数组,可以方便地进行状态累加。然后通过暴力遍历,找出长度为k的灯泡组合中,使得总和s(k)最小时的k值,即题目所求的目标是找到最小的k减去s(k)的差值。

764

被折叠的 条评论
为什么被折叠?



