算法标签:模拟 差分
实现代码:
import java.util.*;
public class Main {
static int n, m, k;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
int l = 1, res = 0;
for (int i = 0; i < m; i++) {
int a = sc.nextInt();
if (a - k > l && k != 0) res += Math.ceil((a - k - l) * 1.0 / (2 * k + 1));
// Math.ceil() ;向上取整
// 2 * k + 1 是说以自己为中点加上左右两边这样是最长的
// 这个位置一定得乘1.0因为'a - k - l' < '2 * k + 1'使等于零向上取整无效
l = a + k + 1; // 到第一个没有灯的位置
}
if (l == n) res += 1;
// 根据上面说的到第一个没有灯的位置 , 所以正好相等的时候最后一点是没有灯的 , 直接加1即可
if (l < n) res += Math.ceil((n - l + 1) * 1.0 / (2 * k + 1));
// 还是根据l的定义第一个没有灯的位置,剩余没有灯光的范围大小是n-l+1
if (k == 0) System.out.println(n - m);
// 如果相等的话,说明一个灯只能照亮自己所在位置,得另外讨论所以上边的for循环中有一个k != 0 的条件
else System.out.println(res);
}
}
}