【贪心】监测点
題目描述
“多么希望有一天突然驚醒,發現自己是在小學的一節課上睡著了,現在經歷的一切都是一場夢,桌上滿是你的口水。你告訴同桌,說做了一個好長好長的夢。同桌罵你白癡,叫你好好聽課。你看著窗外的球場,一切都那么熟悉,一切還充滿希望……”張琪曼通過時空監測點聽到40年前的小墨老師對李旭琳這樣說。
話說張琪曼等人將歷史時間線劃分了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;
}
View Code
總結
- 上一篇: kotlin ?.let ?:let 连
- 下一篇: 初识EseNt