水题:电话传递

一个办公室有N张桌子从左至右排列,有些桌子上放了电话。 当第j个桌子上的电话响了后,第i个桌子上的电话也会响,当且仅当∣j-i∣≤D。 现在给出电话的摆放情况,请你求出最小需要添加几个电话,能使最后一个桌子上的电话响起。 保证第一张桌子和最后一张桌子有电话放置。

Format

Input

第一行包含两个正整数N和D,分别表示桌子个数和最大距离。 第二行包含NN个整数A_i。 如果A_i=1,那么表示这个桌子上有电话,如果A_i=0=0,则表示没有。 1≤D≤N≤3×10^5

Output

一行,一个整数,表示最小需要添加电话个数

思路:先看看在D步的范围里,有没有电话,有的话就跳到最大的一个上去,否则在第D步装一个电话

CODE:

#include<bits/stdc++.h>
using namespace std;
int n,d,a[300010],ans,r=1;
int main() {
	cin>>n>>d;
	for(int i=1; i<=n; i++)
		cin>>a[i];
	while(r<n) {
		int q=0;
		for(int i=r+1; i<=r+d; i++) {//看看在D步的范围内有没有电话
			if(a[i])
				q=i;
		}
		if(!q)
			ans++,r+=d;
		else
			r=q;
	}
	cout<<ans<<endl;

	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_55599629/article/details/119966085