有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的人的距离为i与j之差的绝对值。
每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,一共有多少个小偷会被警察发现吗?
#include <iostream>
using namespace std;
int main()
{
int n,x,count = 0;
char s[100001];
cin >> n;
for (int i = 0;i < n; ++i)
cin >> s[i];
for (int i = 0;i < n; ++i)
{
if (s[i] == '1'|| s[i] == '2' || s[i] == '3'|| s[i] == '4'
|| s[i] == '5'|| s[i] == '6'|| s[i] == '7'|| s[i] == '8'|| s[i] == '9')
{
x = s[i] - '0';
int left, right;
if ((i - x) <= 0)
left = 0;
else
left = (i - x);
right = (i + x);
for (int j = left; j <= right; ++j)
{
if (s[j] == 'X')
{
count++;
s[j] = '#';
}
}
}
}
cout << count;
return 0;
}
下面是官网给出的答案:
#include <bits/stdc++.h>
#define maxn 100009
using namespace std;
int n;
char s[maxn];
bool vis[maxn];
int main(){
scanf("%d", &n);
scanf("%s", s);
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++){
if(s[i] == 'X' || s[i] == '#')
continue;
int x = s[i] - '0';
for(int j = 0; j <= x; j++){
if(i - j >= 0)
vis[i - j] = 1;
if(i + j < n)
vis[i + j] = 1;
}
}
int ans = 0;
for(int i = 0; i < n; i++){
if(s[i] == 'X' && vis[i])
ans++;
}
printf("%d\n", ans);
return 0;
}