题目连接: Social Distance
大致题意:
给你一个整数n表示01串长度, 给你一个整数k表示间隔, 然后给出01串.
1的位置表示有人, 0的位置表示没人, 要求人与人之间需要间隔k个位置, 且保证给你的01串是满足这个要求的, 问你有几个位置可以坐人.
解题思路:
由于他给我们的01串是一定满足要求的, 所以我们可以考虑从左向右枚举每一个位置, 假设为i 如果[i, i+k]都没有人, 那么说明i位置是可以坐人的. 如果[i, i+k]区间内有人, 假设在j位置, 那么我们下一次可以坐人的位置起码也是j+k+1(我们要保证左侧恒有k个间隔).
复杂度分析: O(n), 双指针算法
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2E5 + 10;
char s[N];
int main(void)
{
int t; scanf("%d", &t);
while (t--) {
int n, k; scanf("%d %d", &n, &k);
scanf("%s", s + 1); //从下标1开始存放字符串
int res = 0;
for (int i = 1; i <= n; ++i) {
bool flag = 1;
for (int j = i; j <= n && j <= i + k; ++j) {
if (s[j] == '1') { i = j + k; flag = 0; break; } //[i, i + k]有人 则转跳i
}
if (flag) res++, s[i] = '1', i += k; //[i, i+k]安全, 统计结果
}
printf("%d\n", res);
}
return 0;
}
本题的核心是, 因为从左侧开始模拟, 所以最开始左侧是一定满足要求的, 所以我们如果一直维护左侧满足要求, 则我们每次只需要用一个指针来判断右侧是否满足条件即可