usaco 4.1 Fence Rails

来源:互联网 发布:windows phome 编辑:程序博客网 时间:2024/05/08 21:07
/*ID: daniel.20LANG: JAVATASK: fence8*/import java.io.*;import java.math.BigInteger;import java.util.*;class problem{    int[] boards;    int[] rails;    int[] rails_sum;    int tot_boards;    int boards_copy[];    int waste;    StringBuilder sb = new StringBuilder();    void buble_sort(){        for(int i=0;i<boards.length;i++){            for(int j=i+1;j<boards.length;j++){                if(boards[i]<boards[j]){                    int tmp = boards[i];                    boards[i] = boards[j];                    boards[j] = tmp;                }            }        }    }    void solver() throws IOException{        long start = System.currentTimeMillis();        //BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        BufferedReader reader = new BufferedReader(new FileReader("fence8.in"));          PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("fence8.out")));                 int n = Integer.valueOf(reader.readLine());        boards = new int[n];        boards_copy = new int[n];        for(int i=0;i<n;i++){            boards[i] = Integer.valueOf(reader.readLine());            tot_boards += boards[i];        }        int r = Integer.valueOf(reader.readLine());        rails = new int[r];        rails_sum = new int[r];        for(int i=0;i<r;i++){            rails[i] = Integer.valueOf(reader.readLine());        }        Arrays.sort(rails);        buble_sort();        for(int i=0;i<r;i++){            rails_sum[i]=rails[i]+(i>0?rails_sum[i-1]:0);        }        while(r>0&&rails[r-1]>boards[0]) r--;        while(n>0&&boards[n-1]<rails[0]) n--;        if(r==0||n==0){            sb.append(0);        }else{            int left=0,right=r-1;            int mid = (left+right+1)/2;            while(left<right){                System.arraycopy(boards, 0, boards_copy, 0, n);                waste = 0;                if(dfs(mid, 0, n-1, tot_boards-rails_sum[mid])){                    left = mid;                    mid = (left+right+1)/2;                }else{                    right = mid-1;                    mid = (left+right+1)/2;                }            }            sb.append(mid+1);        }        System.out.println(sb.toString());        out.println(sb.toString());          out.close();          System.out.println("$:"+(System.currentTimeMillis()-start));        System.exit(0);            }     boolean dfs(int rail_deep, int board_start, int n, int maywaste){        if(rail_deep<0) return true;        if(boards_copy[board_start]>rails_sum[rail_deep]) return true;        if(waste>maywaste) return false;        boolean vis[] = new boolean[boards[0]+1];        for(int i=board_start;i<=n;i++){            if(boards_copy[i]<rails[rail_deep]) continue;            if(vis[boards[i]]) continue;            vis[boards[i]] = true;                        boards_copy[i]-=rails[rail_deep];            if(boards_copy[i]<rails[0]) waste+=boards_copy[i];            int next_start = 0;            if(rail_deep>0&&rails[rail_deep]==rails[rail_deep-1]){                next_start = i;            }            if(dfs(rail_deep-1,next_start,n,maywaste)) return true;            if(boards_copy[i]<rails[0]) waste-=boards_copy[i];            boards_copy[i]+=rails[rail_deep];        }        return false;    }}public class fence8 {    public static void main (String [] args) throws Exception {        problem p = new problem();        p.solver();    }}

好困难的搜索题。

而且java有点被卡时间,一些特殊的case java时间不太够...

DFSID还是不太会,需要多学习

0 0
原创粉丝点击