1. 程式人生 > >1133 不重疊的線段(貪心)

1133 不重疊的線段(貪心)

X軸上有N條線段,每條線段有1個起點S和終點E。最多能夠選出多少條互不重疊的線段。
(注:起點或終點重疊,不算重疊)。例如:[1 5][2 3][3 6],可以選[2 3][3 6],這2條線段互不重疊。

思路:

以結束時間排序,最先結束就可以更早的開始,這樣才會更多的進行任務

程式碼:

package _51_node.greedy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class ex_1133 {
    /**
     * 1133 不重疊的線段
     * 1 秒  131,072 KB 10 分 2 級題
     * X軸上有N條線段,每條線段有1個起點S和終點E。最多能夠選出多少條互不重疊的線段。
     * (注:起點或終點重疊,不算重疊)。例如:[1 5][2 3][3 6],可以選[2 3][3 6],這2條線段互不重疊。
     *
     *
     * @param args
     */
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        ArrayList<Point> arrayList = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            int a = cin.nextInt();
            int b = cin.nextInt();
            arrayList.add(new Point(a, b));
        }
        cin.close();
        Collections.sort(arrayList, new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                return o1.end - o2.end;
            }
        });
        long ans = 0, t = (long)-1e9;

        for (int i = 0; i < arrayList.size(); i++) {
            if(arrayList.get(i).start >= t) {
                t = arrayList.get(i).end;
                ans++;
            }
        }
        System.out.println(ans);
    }

    static class Point {
        int start;
        int end;


        public Point(int start, int end) {
            this.start = start;
            this.end = end;

        }
    }
}