题目描述
“多么希望有一天突然惊醒,发现自己是在小学的一节课上睡着了,现在经历的一切都是一场梦,桌上满是你的口水。你告诉同桌,说做了一个好长好长的梦。同桌骂你白痴,叫你好好听课。你看着窗外的球场,一切都那么熟悉,一切还充满希望……”张琪曼通过时空监测点听到40年前的小墨老师对李旭琳这样说。
话说张琪曼等人将历史时间线划分了n个区域,我们可以将之看成是数轴上的n个闭区间[ai,bi]。现要设置尽量少的监测点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个),请问需要多少个监测点?
话说张琪曼等人将历史时间线划分了n个区域,我们可以将之看成是数轴上的n个闭区间[ai,bi]。现要设置尽量少的监测点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个),请问需要多少个监测点?
输入
第一行为一个整数X,表示有X组数据,每组数据第一行为一个整数n(N≤100),表示有n个闭区间,随后n行每行为两个整数,表示区间左端a和右端b(0≤a≤b≤100)。
输出
一个整数,即监测点个数。
样例输入
1
3
1 5
2 8
6 9
样例输出
2
分析:其实这题和上一题一样。。。
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; pair<int,int>aa[115]; int n,ans,t; void init(){ cin>>t; } void swap(int&a,int&b){ int tmp=a; a=b; b=tmp; } bool cmp(pair<int,int>a,pair<int,int>b){ return a.second<b.second||a.second==b.second&&a.first<b.first; } void solve(){ while(t--) { cin >> n; int s, e; range(i, 1, n) { cin >> s >> e; if (s > e)swap(s, e); aa[i].first = s; aa[i].second = e; } sort(aa + 1, aa + 1 + n, cmp); ans = 1; int pos = 1; range(i, 2, n) if (aa[i].first > aa[pos].second) { ++ans; pos = i; } cout << ans << endl; } } int main() { init(); solve(); return 0; }