题目描述
一条直线上等距离放置了n台路由器。路由器自左向右从1到n编号。第i台路由器到第j台路由器的距离为| i-j |。 每台路由器都有自己的信号强度,第i台路由器的信号强度为ai。所有与第i台路由器距离不超过ai的路由器可以收到第i台路由器的信号(注意,每台路由器都能收到自己的信号)。问一共有多少台路由器可以收到至少k台不同路由器的信号。
输入描述:
输入第一行两个数n , k(1≤n , k≤10^5)
第二行n个数, a1 , a2 , a3……… , an(0≤ai≤10^9)
输出描述:
输出一个数,一共有多少台路由器可以收到至少k台不同路由器的信号。
示例1
输入
4 4
3 3 3 3
输出
4
Java代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String[] strs =sc.nextLine().split(" ");
int n = Integer.valueOf(strs[0]);
int k = Integer.valueOf(strs[1]);
strs = sc.nextLine().split(" ");
int[] values = new int[n];
int[][] nums = new int[n][2];
int[] dp =new int[n+1];
int num = 0;
for(int i=0;i<n;i++){
values[i] = Integer.valueOf(strs[i]);
}
//用一遍循环来记录到达的左边界、右边界
for(int i=0;i<values.length;i++){
nums[i][0] = Math.max(0,i-values[i]);
nums[i][1] = Math.min(n,1+i+values[i]);
}
//利用差分数组的特性,计算和放入到数组dp中去
for(int i =0;i<n;i++){
dp[nums[i][0]] += 1;
dp[nums[i][1]] -= 1;
}
int temp = 0;
//利用特性,假如有符合范围要求的,则num++
for(int i =0;i<dp.length;i++){
temp += dp[i];
if(temp>=k)
num++;
}
System.out.println(num);
}
}
}