线段覆盖

D14556. 线段覆盖

时间限制1.0s   内存限制256.0MB

输入文件名:test.in   输出文件名:test.out

问题描述

  给定x轴上的N(0 < N < 100)条线段。每个线段由它的两个端点a_i和b_i确定,i=1,2,……,N。这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓内部公共点是指一个点同时属于两条线段至少在其中一条线段的内部(即除去端点的部分)。

输入格式

  一个整数N。接下来有N行,每行有两个空格隔开的整数,表示一条线段的两个端点的坐标。

输出格式

  一行:是一个整数表示最多剩下的线段数。

样例输入

3
6 3
1 3
2 5

样例输出

2

思路:

与活动选择没有本质上的区别,只是多了一些细节处理。

读入时左右端点非有序,要自己排一下。

然后根据右端点大小排序,判断冲突与选择,此处段点可以相等,统计出解。

证明略。

注意由于坐标所在区间(-999,999),所以右端点的限值起始赋为-1000.

 

Code:

#include<bits/stdc++.h>

#define e first

#define b second

 

using namespace std;

 

int n, ans = 0;

pair <int, int> line[110];

 

int main(){

        freopen("test.in","r",stdin);

        freopen("test.out","w",stdout);

        cin >> n;

        for (int i = 1; i <= n; i++) {

              int x, y;

              cin >> x >> y;

              line[i].b = min(x, y);

              line[i].e = max(x, y);

       }

        sort(line + 1, line + n + 1);

        int last = -1000;//划重点,题目中坐标范围-999~999,起始结束时间要为-1000以下。

        for (int i = 1; i <= n; i++) {

                if (line[i].b >= last) {

                        ans++;

                        last = line[i].e;

                }

        }

        cout << ans << endl;

        return 0;

}

 

猜你喜欢

转载自www.cnblogs.com/sun915/p/9494269.html
今日推荐