poj 3190 Stall Reservations

来源:互联网 发布:雷达图制作软件 编辑:程序博客网 时间:2024/05/02 02:17

按照起始时间排序,然后对于任意一段,搜索可以和它合并的下一段,

为了保证尽量合并,贪心下一段起始时间

然后求下一段的过程用二分即可,二分还要注意去掉之前已经用过的段,瞎逼二分居然过了

import java.io.*;import java.math.BigInteger;import java.util.*;class item implements Comparable<item>{    int l,r;    int index;    public item(int a, int b, int c){        l=a;r=b;index=c;    }    @Override    public int compareTo(item t) {        if(this.l==t.l) return this.r-t.r;        else return this.l-t.l;    }}class problem1 {    int n,left=Integer.MAX_VALUE,right=0;    item arr[];    int vis[];    StringBuilder sb = new StringBuilder();    void solver() throws IOException {        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));                StringTokenizer st = new StringTokenizer(reader.readLine());        n = Integer.valueOf(st.nextToken());        arr = new item[n];        vis = new int[n];        for(int i=0;i<n;i++){            st = new StringTokenizer(reader.readLine());            int l = Integer.valueOf(st.nextToken());            int r = Integer.valueOf(st.nextToken());            if(l<left) left=l;            if(r>right) right=r;            arr[i] = new item(l,r,i);        }        Arrays.sort(arr);        int stall=1;        for(int i=0;i<n;i++){             if(vis[arr[i].index]!=0) continue;             vis[arr[i].index]=stall;             int next=i;             while(true){                 int tmp = search(next);                 if(tmp>next&&tmp<n){                     vis[arr[tmp].index]=stall;                     next=tmp;                 }else{                     break;                 }             }             stall++;        }        System.out.println(stall-1);        for(int i=0;i<n;i++){            sb.append(vis[i]).append("\n");        }        System.out.println(sb.toString());    }    int search(int i){        int x = i; int y=n-1;         while(x<=y){            int mid = (x+y)/2;            if(arr[mid].l>arr[i].r){                y=mid-1;            }else{                x=mid+1;            }        }        if(x<n&&vis[arr[x].index]!=0){            while(x<n-1){                x++;                if(vis[arr[x].index]==0) break;            }        }        return x;    }} public class stackingbox {    public static void main(String[] args) throws Exception {        problem1 p = new problem1();        p.solver();    }}


0 0
原创粉丝点击