P2255 [USACO14JAN]Recording the Moolympics S
https://www.luogu.com.cn/problem/P2255
涉及知识点:区间贪心,排序
黄色题
涉及知识点:区间贪心,排序
黄色题
思路:
这题是一道区间贪心。
一般的区间贪心题是给你 N 个区间,你的任务是尽量让更多的区间两两不重合。
对于一般的区间问题,我们要把每个区间的右端点从小到大排序,再按排好序的顺序来处理,因为这样可以使每个任务结束时间更早,以便安排下一个区间。
一般的区间贪心题有自私的放牧和线段覆盖。(其实是一模一样的题目,你交同一份代码都能AC,暗示着双倍经验)
接下来看这道题,这道题与一般的区间贪心的唯一区别是约翰的录音机非常神奇,可以同时记录两个节目。(两个节目的声音互相干扰真不知道约翰怎么录的)于是我们可以看做约翰有两个录音机,每一个都可以单独记录节目。我们每次处理节目,要尽量让每个录音机的空闲时间少,再按普通区间贪心的做法来解决。
结束时间越晚,与下一个节目的开始时间相距越短,空闲时间也就越少
代码:
#include<bits/stdc++.h> using namespace std; int n,ans; struct node{ int s,e; }a[155]; bool cmp(node a,node b) { return a.e<b.e; } int main() { cin>>n; for(int i=1; i<=n; i++) { cin>>a[i].s>>a[i].e; } sort(a+1,a+n+1,cmp); int p1=0,p2=0; for(int i=1; i<=n; i++) { if(a[i].s>=p1&&p1>p2||(a[i].s>=p1&&a[i].s<p2)) { ans++; p1=a[i].e; } else if(a[i].s>=p2) { ans++; p2=a[i].e; } } cout<<ans; return 0; }