B. Distances to Zero
time limit per test
2 secondsmemory limit per test
256 megabytesinput
standard inputoutput
standard outputYou are given the array of integer numbers a0, a1, ..., an - 1. For each element find the distance to the nearest zero (to the element which equals to zero). There is at least one zero element in the given array.
Input
The first line contains integer n (1 ≤ n ≤ 2·105) — length of the array a. The second line contains integer elements of the array separated by single spaces ( - 109 ≤ ai ≤ 109).
Output
Print the sequence d0, d1, ..., dn - 1, where di is the difference of indices between i and nearest j such that aj = 0. It is possible that i = j.
Examples
Input
9 2 1 0 3 0 0 3 2 4
Output
2 1 0 1 0 0 1 2 3
Input
5 0 1 2 3 4
Output
0 1 2 3 4
Input
7 5 6 0 1 -2 3 4
Output
2 1 0 1 2 3 4
给出一个数列,求每个数距离数列中0的最近距离;
思路:记录每个0的位置,然后从前往后遍历一遍求距离0的距离,如果某个数在两个零之间,则取较小值;
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
int num[200005];
int zero[200005];
int main(){
int n;
cin >> n;
int k=0;
for(int i=1; i<=n; i++){
cin >> num[i];
if(num[i]==0) zero[++k]=i;
}
int dis=0;
int cnt=k;
k=1;
zero[0]=0;
for(int i=1; i<=n; i++){
dis=abs(i-zero[k]);
if(dis==0){
k++;
}
if(k>1 && zero[k]!=0 && k<=cnt) dis=min(dis, abs(i-zero[k-1])); //如果位于两个0之间,取较小值;
if(k>cnt) dis=abs(i-zero[cnt]);
//cout << "k:" << k << endl;
cout << dis;
if(i==n) cout << endl;
else cout << ' ';
}
return 0;
}
本文介绍了一个算法问题,即给定一个包含整数的数组,如何找出每个元素到数组中最近的零元素的距离。通过记录所有零元素的位置并进行一次遍历,可以高效地解决这一问题。

557

被折叠的 条评论
为什么被折叠?



