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; }