区间问题(贪心)

区间选点

在这里插入图片描述
在这里插入图片描述

import java.io.*;
import java.util.*;

class Range implements Comparable<Range>{
    
    
    int l;
    int r;
    public Range(int l,int r){
    
    
        this.l=l;
        this.r=r;
    }
    public int compareTo(Range o){
    
    
        return Integer.compare(r,o.r);
    }
}

public class Main{
    
    
    static int N=100010;
    static Range[] range=new Range[N];
    public static void main(String[] args)throws IOException{
    
    
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(in.readLine());
        String[] strs;
        for(int i=0;i<n;i++){
    
    
            strs=in.readLine().split(" ");
            int l=Integer.parseInt(strs[0]);
            int r=Integer.parseInt(strs[1]);
            range[i]=new Range(l,r);
        }
        Arrays.sort(range,0,n);
        
        int res=1;
        int rear=range[0].r;
        for(int i=1;i<n;i++){
    
    
            if(range[i].l>rear){
    
    
                rear=range[i].r;
                res++;
            }
        }
        System.out.println(res);
    }
}

最大不相交区间数量

在这里插入图片描述
在这里插入图片描述

import java.io.*;
import java.util.*;

class Range implements Comparable<Range>{
    
    
    int l;
    int r;
    public Range(int l,int r){
    
    
        this.l=l;
        this.r=r;
    }
    public int compareTo(Range o){
    
    
        return Integer.compare(r,o.r);
    }
}

public class Main{
    
    
    static int N=100010;
    static Range[] range=new Range[N];
    public static void main(String[] args)throws IOException{
    
    
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(in.readLine());
        String[] strs;
        for(int i=0;i<n;i++){
    
    
            strs=in.readLine().split(" ");
            int l=Integer.parseInt(strs[0]);
            int r=Integer.parseInt(strs[1]);
            range[i]=new Range(l,r);
        }
        Arrays.sort(range,0,n);
        
        int res=0;
        int ed=(int)(-1e9);
        for(int i=0;i<n;i++){
    
    
            if(range[i].l>ed){
    
    
                ed=range[i].r;
                res++;
            }
        }
        System.out.println(res);
    }
}

区间分组

在这里插入图片描述
在这里插入图片描述
代码实现①(手写堆优化):
不了解手写堆的请看:https://blog.csdn.net/m0_54136420/article/details/117868795

import java.io.*;
import java.util.*;

class Range implements Comparable<Range>{
    
    
    int l;
    int r;
    public Range(int l,int r){
    
    
        this.l=l;
        this.r=r;
    }
    public int compareTo(Range o){
    
    
        return Integer.compare(l,o.l);
    }
}

public class Main{
    
    
    static int N=100010;
    static Range[] range=new Range[N];
    static int[] h=new int[N];
    static int cnt;
    public static void main(String[] args)throws IOException{
    
    
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(in.readLine());
        String[] strs;
        for(int i=0;i<n;i++){
    
    
            strs=in.readLine().split(" ");
            int l=Integer.parseInt(strs[0]);
            int r=Integer.parseInt(strs[1]);
            range[i]=new Range(l,r);
        }
        Arrays.sort(range,0,n);
        for(int i=0;i<n;i++){
    
    
            if(i==0||range[i].l<=h[1]){
    
    
                h[++cnt]=range[i].r;
                up(cnt);
            }
            else{
    
    
                h[1]=range[i].r;
                down(1);
            }
        }
        System.out.println(cnt);
    }
    static void up(int u){
    
    
        while(u/2>0&&h[u]<h[u/2]){
    
    
            int temp=h[u];
            h[u]=h[u/2];
            h[u/2]=temp;
            u>>=1;
        }
    }
    static void down(int u){
    
    
        int t=u;
        if(u*2<=cnt && h[u*2]<h[t])t=u*2;
        if(u*2+1<=cnt&&h[u*2+1]<h[t])t=u*2+1;
        if(u!=t){
    
    
            int temp=h[u];
            h[u]=h[t];
            h[t]=temp;
            down(t);
        }
    }
}

代码实现②(优先队列实现小根堆):
不了解的请看:https://blog.csdn.net/m0_54136420/article/details/126808856

import java.io.*;
import java.util.*;

class Range implements Comparable<Range>{
    
    
    int l;
    int r;
    public Range(int l,int r){
    
    
        this.l=l;
        this.r=r;
    }
    public int compareTo(Range o){
    
    
        return Integer.compare(l,o.l);
    }
}

public class Main{
    
    
    static int N=100010;
    static Range[] range=new Range[N];
    static int[] h=new int[N];
    static int cnt;
    public static void main(String[] args)throws IOException{
    
    
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(in.readLine());
        String[] strs;
        for(int i=0;i<n;i++){
    
    
            strs=in.readLine().split(" ");
            int l=Integer.parseInt(strs[0]);
            int r=Integer.parseInt(strs[1]);
            range[i]=new Range(l,r);
        }
        Arrays.sort(range,0,n);
        Queue<Integer> h=new PriorityQueue<>();
        for(int i=0;i<n;i++){
    
    
            if(i==0||range[i].l<=h.peek())
                h.add(range[i].r);
            else{
    
    
                h.poll();
                h.add(range[i].r);
            }
        }
        System.out.println(h.size());
    }
}

区间覆盖

在这里插入图片描述
在这里插入图片描述

import java.io.*;
import java.util.*;

class Range implements Comparable<Range>{
    
    
    int l;
    int r;
    public Range(int l,int r){
    
    
        this.l=l;
        this.r=r;
    }
    public int compareTo(Range o){
    
    
        return Integer.compare(l,o.l);
    }
}

public class Main{
    
    
    static int N=100010;
    static Range[] range=new Range[N];
    public static void main(String[] args)throws IOException{
    
    
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int s,t;
        String[] strs=in.readLine().split(" ");
        s=Integer.parseInt(strs[0]);
        t=Integer.parseInt(strs[1]);
        int n=Integer.parseInt(in.readLine());
        for(int i=0;i<n;i++){
    
    
            strs=in.readLine().split(" ");
            int l=Integer.parseInt(strs[0]);
            int r=Integer.parseInt(strs[1]);
            range[i]=new Range(l,r);
        }
        Arrays.sort(range,0,n);
        int cnt=0;
        boolean flag=true;
        int maxr=s;
        for(int i=0;i<n;){
    
    
            if(range[i].l>s){
    
    
                flag=false;
                break;
            }
            while(i<n&&range[i].l<=s){
    
    
                if(range[i].r>=maxr)
                    maxr=range[i].r;
                i++;
            }
            if(maxr!=s||s==t){
    
    
                s=maxr;
                cnt++;
            }
            if(s>=t)break;
        }
        if(flag&&range[n-1].r>=t)System.out.println(cnt);
        else System.out.println("-1");
    }
}

猜你喜欢

转载自blog.csdn.net/m0_54136420/article/details/129692601
今日推荐