洛谷 p1803 凌乱的yyy

这是一道贪心思想的题目,这个题目的贪心类型非常经典,在《挑战程序设计竞赛》中贪心这一节有对这类题型的讲解

基本上可以概述为,给定一堆区间(给出区间起点和终点),然后选区间,但是有重复区域的区间不能都选,求出最多可选多少区间

这道题的思想就是优先选结束时间最短的区间,因为无论区间开始时间如何,若结束时间短,它便会留出更多空间给其它区间

可能有人会有疑问,若有很多很多开始时间卡在那个最短区间区域内的区间时,岂不是那么多区间就都不能选了

实际上,就是不能选,仔细想一想,即使那些区间很多,但是若选了那些区间中的任意一个,其它的这类区间也都选不了了,到头来那么多区间也是只有一个区间被选上,同时由于你选的这个不是结束时间更短的,反而还会造成后面开始的区间也选不上,所以无论怎样,你都会发现选最早结束的区间是最划算的

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

猜你喜欢

转载自www.cnblogs.com/ssNiper/p/11253347.html