- 过河
- 2017-02-13 13:39:59 @
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.TreeSet;
public class Main {
// 用于储存某点的最少石头数,每次搜索时访问,若无记录添加并继续,若有记录比较,较多或相等则退出,较少则更新并继续
// key=long 位置
// value=int 最少踩到的石头数
static HashMap<Long, Integer> stoneL = new HashMap<Long, Integer>();
// 用于储存石头的位置 用 containsKey(key)搜索
static HashMap<Long, Integer> stoneP = new HashMap<Long, Integer>();
// 桥长long L
static long l;
// 跳跃距离介于int S T
static int s, t;
// 石子个数int M
static int m;
// 用于实现广度搜索的栈 long 位置 int 石头数
static TreeMap<Long, Integer> tm = new TreeMap<Long, Integer>();
static TreeSet<Long> ts=new TreeSet<Long>();
// 递归广度搜索函数
static void jump(long formPoint, int formStone) {
for (int i = s; i < t + 1&&formPoint<l; i++) {
long curPoint = formPoint + i;
int curStone = formStone;
// 如果该点有石头,当前踩到石头数+1
if (stoneP.containsKey(curPoint)) {
curStone += 1;
}
// 如果表中无该点数据,添加
if (!stoneL.containsKey(curPoint)) {
stoneL.put(curPoint, curStone);
tm.put(curPoint, curStone);
// 如果有数据,进行比较
// 如果少于一直最少石头,更新
} else if (curStone < stoneL.get(curPoint)) {
stoneL.put(curPoint, curStone);
tm.put(curPoint, curStone);
// 如果多于已知最少石头,跳过
} else {
continue;
}
}
while(!tm.isEmpty()){
long pointStack=tm.firstKey();
int stoneStack=tm.get(pointStack);
tm.remove(pointStack);
jump(pointStack,stoneStack);
}
}
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
l = Long.valueOf(br.readLine());
l=0;//此处清空了l
String str = br.readLine();
String[] sstr = str.split(" ");
s = Integer.valueOf(sstr[0]);
t = Integer.valueOf(sstr[1]);
m = Integer.valueOf(sstr[2]);
str = br.readLine();
sstr = str.split(" ");
for (String ss : sstr) {
ts.add(Long.valueOf(ss));
}
if(s==t){
int count=0;
for (Long sto : ts) {
if(sto%s==0){
count++;
}
}
System.out.println(count);
return;
}
long yusto=0;
for (Long sto : ts) {
if(sto-yusto>81){
l+=81;
}else{
l=l+sto-yusto;
}
stoneP.put(l, 1);
yusto=sto;
}
jump(0,0);
TreeMap<Long, Integer> tm2 = new TreeMap<Long, Integer>();
for(long j=l;j<l+t;j++){
if(stoneL.containsKey(j)){
tm2.put(j, stoneL.get(j));
}
}
System.out.println(tm2.get(tm2.firstKey()));
// 输出
}
}
10 条评论
-
龙箫灬 LV 0 @ 2017-02-18 15:30:43
// input code here
-
2017-02-14 12:36:37@
没错,我们是一个人
-
2017-02-14 12:35:49@
没错,我就是学c++的
-
2017-02-14 12:33:01@
对不起,我是学c++的
-
2017-02-14 12:32:24@
对不起,我是学c++的
-
2017-02-14 12:31:53@
对不起,我是学c++的
-
2017-02-14 12:31:38@
对不起,我是学c++的
-
2017-02-14 12:31:16@
对不起,我是学c++的
-
2017-02-14 12:30:51@
对不起,我是学c++的
-
2017-02-14 12:30:49@
对不起,我是学c++的
- 1