在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
1<=L<=10^9,
1<=S<=T<=10,
1<=M<=100
输入描述:
第一行有一个正整数L ,表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。
输出描述:
只包括一个整数,表示青蛙过河最少需要踩到的石子数。
示例1
输入
10
2 3 5
2 3 5 6 7
输出
2
https://www.nowcoder.com/questionTerminal/35ddfeb4e34f410bb9035682463a382f?answerType=1&f=discussion
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
int n = in.nextInt();
int s = in.nextInt();
int t = in.nextInt();
int m = in.nextInt();
ArrayList<Integer> stones = new ArrayList();
for(int i=0;i<m;i++) {
stones.add(in.nextInt());
}
Collections.sort(stones);
if(s==t) {
singleJudge(s,stones);
} else {
rangeJudge(s,t,n,stones);
}
}
}
public static void singleJudge(int s,ArrayList<Integer> stones) {
int stoneNumber = 0;
for(int i=0;i<stones.size();i++) {
if(stones.get(i)%s == 0) {
stoneNumber++;
}
}
System.out.println(stoneNumber);
}
public static void rangeJudge(int s,int t,int n,ArrayList<Integer> stones) {
int compressLen = compressBridgeLength(stones,n,t);
int[] dp = new int[compressLen+t+1];
Arrays.fill(dp,10000);
dp[0] = 0;
int stoneNumber = 10000;
int maxStep = 0;
for(int i=s;i<=compressLen+t;i++) {
maxStep = Math.max(maxStep,i);
for(int j=s;j<=t;j++) {
if(i>=j) {
dp[i] = Math.min(dp[i],dp[i-j]);
}
}
if(stones.contains(i)) {
dp[i] +=1;
}
}
for(int i=compressLen;i<=maxStep;i++) {
stoneNumber = Math.min(dp[i],stoneNumber);
}
System.out.println(stoneNumber);
}
public static int compressBridgeLength(ArrayList<Integer> stones,int n,int t) {
for(int i=1;i<stones.size();i++) {
int distance = stones.get(i) - stones.get(i-1);
stones.set(i,stones.get(i-1) + distance%90);
}
n = (n - stones.get(stones.size()-1))%90 + stones.get(stones.size()-1);
return n;
}
}