1. 程式人生 > >演算法設計與分析: 4-21 區間相交問題

演算法設計與分析: 4-21 區間相交問題

4-21 區間相交問題

問題描述

給定 x 軸上 n 個閉區間。去掉儘可能少的閉區間,使剩下的閉區間都不相交。

給定 n 個閉區間,程式設計計算去掉的最少閉區間數。

資料輸入:
第一行是正整數 n,表示閉區間數。接下來的 n 行中,每行有 2 個整數,分別表示閉區間的 2 個端點。

Java

import java.util.*;

public class QuJianXiangJiao {

    private static class INTERVAL implements Comparable{
        int left;
        int
right; boolean delete; public int compareTo(Object o){ INTERVAL interval = (INTERVAL) o; int result = Integer.compare(right, interval.right);//升序 return result; } } private static int n; private static List<INTERVAL> intervals; public
static void main(String[] args){ Scanner input = new Scanner(System.in); while (true){ n = input.nextInt(); intervals = new ArrayList<>(n); for(int i=0; i<n; i++){ INTERVAL tmp = new INTERVAL(); tmp.left = input.nextInt(); tmp.right = input.nextInt(); if
(tmp.left > tmp.right){ int temp = tmp.right; tmp.right = tmp.left; tmp.left = temp; } intervals.add(tmp); } Collections.sort(intervals); int result = greedy(); System.out.println(result); } } //每次選取右端點座標最小的閉區間,保留該閉區間,並將與其相交的閉區間刪去 private static int greedy(){ int minRight,count=0; for(int i=0; i<n; i++) for(int j=i+1; j<n; j++){ minRight = intervals.get(i).right; if(!intervals.get(i).delete && !intervals.get(j).delete && intervals.get(j).left<=minRight){ count++; intervals.get(j).delete = true; } } return count; } }

Input & Output

3
10 20
10 15
20 15
2

Reference

王曉東《計算機演算法設計與分析》(第3版)P135