/ Vijos / 讨论 / 过河 /

求助,对照了还不知道错误在哪..WA N次



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 条评论

  • 1

信息

ID
1002
难度
7
分类
动态规划 点击显示
标签
递交数
25264
已通过
4390
通过率
17%
被复制
76
上传者