这是一道贪心思想的题目,这个题目的贪心类型非常经典,在《挑战程序设计竞赛》中贪心这一节有对这类题型的讲解
基本上可以概述为,给定一堆区间(给出区间起点和终点),然后选区间,但是有重复区域的区间不能都选,求出最多可选多少区间
这道题的思想就是优先选结束时间最短的区间,因为无论区间开始时间如何,若结束时间短,它便会留出更多空间给其它区间
可能有人会有疑问,若有很多很多开始时间卡在那个最短区间区域内的区间时,岂不是那么多区间就都不能选了
实际上,就是不能选,仔细想一想,即使那些区间很多,但是若选了那些区间中的任意一个,其它的这类区间也都选不了了,到头来那么多区间也是只有一个区间被选上,同时由于你选的这个不是结束时间更短的,反而还会造成后面开始的区间也选不上,所以无论怎样,你都会发现选最早结束的区间是最划算的
#include<bits/stdc++.h> using namespace std; bool cmp(pair<int, int> a, pair<int, int> b){ return a.first < b.first; } int main(){ ios::sync_with_stdio(false); int n; cin >> n; vector< pair<int, int> > cts(n); for(int i=0; i<n; i++) cin >> cts[i].second >> cts[i].first; sort(cts.begin(), cts.end(), cmp); int ans=0, end=0; for(int i=0; i<n; i++){ if(cts[i].second >= end){ ans++; end = cts[i].first; } } cout << ans; return 0; }