用c语言实现养牛场有n间牛棚,从1到n顺序编号,每间牛棚前面都安装了一盏灯,目前已经点亮了K盏灯。为了保证夜间照明,要求每个连续的r间牛棚至少有两盏灯被点亮,则至少还要点亮多少盏灯? 输入格式: 输入第一行为三个整数n,k,r(2=<n<=100000,0=<k<=n,0=<r<=n),分别代表牛棚个数,已经点亮的灯的盏数,题目要求的连续牛棚间数;随后k行,每行一个整数,代表点亮的k盏灯所处的牛棚编号。 输出格式: 输出为了保证连续的r间牛棚至少有两盏灯被点亮,至少还需要点亮的灯的盏数。
时间: 2024-01-22 10:18:50 浏览: 108
这道题可以用滑动窗口来解决。首先将已经点亮的牛棚标记出来,然后从1开始依次遍历每个牛棚,维护一个长度为r的滑动窗口,窗口内至少有两盏灯点亮,窗口滑动的步长为1。如果窗口内不满足条件,则需要点亮一个灯,同时记录点亮的灯的数量。直到遍历完所有的牛棚,最终点亮的灯的数量就是答案。
具体实现可以参考下面的代码:
```c
#include <stdio.h>
#include <stdbool.h>
int main()
{
int n, k, r;
scanf("%d%d%d", &n, &k, &r);
bool lighted[100001] = {false};
for(int i = 0; i < k; i++) {
int p;
scanf("%d", &p);
lighted[p] = true;
}
int ans = 0;
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(i > r && lighted[i - r - 1]) {
cnt--;
}
if(cnt < 2 && !lighted[i]) {
cnt++;
lighted[i] = true;
ans++;
}
if(cnt == 2 && lighted[i - r]) {
cnt--;
}
}
printf("%d\n", ans);
return 0;
}
```
阅读全文