usaco 5.3.4 Big Barn

来源:互联网 发布:试验数据库 编辑:程序博客网 时间:2024/05/20 04:49
/*ID: daniel.20LANG: JAVATASK: bigbrn*/import java.util.*;import java.io.*;import java.util.logging.Level;import java.util.logging.Logger;class problem2 {    StringBuilder sb = new StringBuilder();    int n,t;    ArrayList<Integer>[] arr;    void solver() throws IOException{          BufferedReader reader = new BufferedReader(new FileReader("bigbrn.in"));        StringTokenizer st = new StringTokenizer(reader.readLine());        n = Integer.valueOf(st.nextToken());        t = Integer.valueOf(st.nextToken());        arr = new ArrayList[n+1];        for(int i=0;i<n+1;i++) arr[i] = new ArrayList<Integer>();        for(int i=0;i<t;i++){            st = new StringTokenizer(reader.readLine());            int x = Integer.valueOf(st.nextToken());            int y = Integer.valueOf(st.nextToken());            arr[x].add(y);        }        int left=1,right=n,mid;        int last_possible = -1;        while(left<=right){            mid = (left+right)/2;            if(search(mid)){                last_possible=mid;                left=mid+1;            }else{                right=mid-1;            }        }        //BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        sb.append(last_possible);        System.out.println(sb.toString());        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bigbrn.out")));        out.println(sb.toString());        out.close();        System.exit(0);       }    boolean search(int d){        for(int i=1;i+d-1<=n;i++){            for(int ii=1;ii+d-1<=n;ii++){                int min_x=i,max_x=i+d-1,min_y=ii,max_y=ii+d-1;                boolean flag = true;                for(int j=min_x;j<=max_x;j++){                    for(int k=0;k<arr[j].size();k++){                        if(arr[j].get(k)<=max_y&&arr[j].get(k)>=min_y) {flag=false;break;}                    }                    if(!flag) break;                }                if(flag) return true;            }        }        return false;    }}public class bigbrn {    public static void main(String[] args) throws Exception {        problem2 p = new problem2();        p.solver();    }}

题意很简单就是一个矩形内有坑,然后要划出一块正方形,正方形内不能有坑,求最大的正方形

感觉没什么很好的办法,就直接枚举正方形的左上角点,再枚举边长,很明显的边长可以二分答案

枚举左上角的点的复杂度不确定,边长大的左上角点的可能性少,边长小的就要枚举左上角点多次。

另外看到最多肯能有10000个坑-.- 于是可以把坑按X坐标分类,在范围以外的坑就不考虑了,枚举每个坑是不是在当前枚举的正方形内

search函数的N四次方的,但是实际上很明显不会有这么高

然后1A了。。。我就跑过了sample,感觉复杂度会爆还是交了一发,准备先和WA战斗,再看是不是算法错误TLE,结果居然过了!!!现在的我太需要这样的motivation了



0 0