Telefoni
Forgotten_freopen · · 题解
简化版题意(可忽略)
给出一个有
解析
因为原题意是让最后一个办公桌上的电话响起,所以我们可以从最后一个电话开始向前枚举。
定义一个变量
q = p;//p 用来记录现在 p 的值。
for(j = 1; j <= d; j++){
if(a[q - j]){//如果这个办公桌上有电话,p 就变成这个办公桌的编号。
p = max(q - j,1);
}
}
如果一轮下来,
if(q == p){//如果p没有变化,就说明需要在 max(p - d,1) 处多一个电话。
s++;
p = max(p - d,1);//同时,p 也变成这个刚有电话的办公桌的编号。
}
最后,只需要在
if(p == 1){//枚举完就退出循环。
break;
}
AC code
#include<bits/stdc++.h>
using namespace std;
int n,d,i,j,s,p,q;
bool a[300005];
int main(){
cin >> n >> d;
for(i = 1; i <= n; i++){
cin >> a[i];
}
p = n;
for(i = 1; ; i++){
q = p;//p 用来记录现在 p 的值。
for(j = 1; j <= d; j++){
if(a[q - j]){//如果这个办公桌上有电话,p 就变成这个办公桌的编号。
p = max(q - j,1);
}
}
if(q == p){//如果p没有变化,就说明需要在 max(p - d,1) 处多一个电话。
s++;
p = max(p - d,1);//同时,p 也变成这个刚有电话的办公桌的编号。
}
if(p == 1){//枚举完就退出循环。
break;
}
}
cout<< s << endl;
return 0;
}