點燈

xkayla發表於2020-10-12
養牛場有n間牛棚,從1到n順序編號,每間牛棚前面都安裝了一盞燈,目前已經點亮了K盞燈。為了保證夜間照明,要求每個連續的r間牛棚至少有兩盞燈被點亮,則至少還要點亮多少盞燈?

輸入格式:
輸入第一行為三個整數n,k,r(2=<n<=100000,0=<k<=n,0=<r<=n),分別代表牛棚個數,已經點亮的燈的盞數,題目要求的連續牛棚間數;隨後k行,每行一個整數,代表點亮的k盞燈所處的牛棚編號。

輸出格式:
輸出為了保證連續的r間牛棚至少有兩盞燈被點亮,至少還需要點亮的燈的盞數。

輸入樣例

15 5 4
2
5
7
10
13

輸出樣例

3
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n,k,r;
int x,cnt,ans,c[maxn];
int main(){
	ios::sync_with_stdio(0);
	cin >> n >> k >> r;
	for(int i = 1; i <= k; i++){
		cin >> x;
		c[x] = 1;
	}
	for(int i = 1; i <= r; i++){
		cnt += c[i];
	}
	for(int i = r; i >= 1 && cnt < 2;i--){
		if(!c[i]){
			c[i] = 1;
			cnt += c[i];
			ans++;
		}
	}
	for(int i = 2; i <= n - r + 1; i++){
		cnt += c[i + r - 1];
		cnt -= c[i - 1];
		for(int j = i + r - 1; j >= 1 && cnt < 2; j--){
			if(!c[j]){
				c[j] = 1;
				cnt += c[j];
				ans++;
			}
		}
	}
	cout << ans << endl;
	return 0;
} 

相關文章