C语言实现养牛场有n间牛棚,从1到n顺序编号,每间牛棚前面都安装了一盏灯,目前已经点亮了K盏灯。为了保证夜间照明,要求每个连续的r间牛棚至少有两盏灯被点亮,则至少还要点亮多少盏灯? 输入格式: 输入第一行为三个整数n,k,r(2=<n<=100000,0=<k<=n,0=<r<=n),分别代表牛棚个数,已经点亮的灯的盏数,题目要求的连续牛棚间数;随后k行,每行一个整数,代表点亮的k盏灯所处的牛棚编号。 输出格式: 输出为了保证连续的r间牛棚至少有两盏灯被点亮,至少还需要点亮的灯的盏数
时间: 2024-03-07 19:46:40 浏览: 227
c代码-请编写函数sum,其功能是:用for循环语句求1到n之间所有偶数之和(若n为偶数包括n), 并将结果返回给主函数。(n值由主函数传入)
这是一道比较典型的贪心算法题目,可以按照以下思路进行解题:
1. 将已经点亮的灯的位置按照从小到大的顺序排序。
2. 从第一个牛棚开始遍历,如果当前牛棚没有被点亮,则需要点亮一盏灯,并将灯的数量加一。
3. 如果当前牛棚已经被点亮,则继续遍历下一个牛棚。
4. 每次遍历连续的r个牛棚,如果这些牛棚中没有两盏灯被点亮,则需要在这些牛棚中点亮一盏灯,并将灯的数量加一。
5. 遍历完所有的牛棚后,输出需要点亮的灯的数量。
以下是一份参考代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k, r;
cin >> n >> k >> r;
vector<int> lights(k);
for (int i = 0; i < k; i++) {
cin >> lights[i];
}
sort(lights.begin(), lights.end());
int cnt = 0;
int i = 1;
while (i <= n) {
if (cnt < k && lights[cnt] == i) {
cnt++;
} else {
cnt++;
i++;
}
if (i > n) {
break;
}
if (i > r && (cnt <= k || lights[cnt - k - 1] < i - r)) {
cnt++;
lights.push_back(i);
}
}
cout << lights.size() - k << endl;
return 0;
}
```
在这份代码中,我们使用了一个计数器cnt来记录已经点亮的灯的数量,使用一个变量i来遍历所有的牛棚。如果当前牛棚已经被点亮,则继续遍历下一个牛棚;否则需要点亮一盏新的灯,并将灯的数量加一。同时,我们使用一个vector来记录已经点亮的灯的位置,方便后续的处理。每次遍历连续的r个牛棚,如果这些牛棚中没有两盏灯被点亮,则需要在这些牛棚中点亮一盏新的灯,并将灯的数量加一。遍历完所有的牛棚后,输出需要点亮的灯的数量即可。
阅读全文