题目链接:https://vjudge.net/problem/Kattis-entertainmentbox
转自:https://www.cnblogs.com/Blogggggg/p/7748599.html
题意:有n个电视节目,磁带一次只能最多同时录k个节目。给出n个电视节目得开始与结束时间,求最多能录多少节目。
思路:lowerbound是查找第一个大于等于的数,upperbound是查找第一个大于的数。先按照结束时间排序。遍历,每次从队列中选择结束时间最接近当前遍历节目的开始时间,因此应当用upperbound。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node
{
int x,y;
bool operator <(node &s)
{
return y<s.y;
}
} no[100005];
int main()
{
vector <int> v;
vector <int> ::iterator it;
int n,k,ans=0;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
{
scanf("%d%d",&no[i].x,&no[i].y);
}
sort(no,no+n);
for(int i=0; i<k; i++)
{
v.push_back(0);
}
for(int i=0; i<n; i++)
{
it=upper_bound(v.begin(),v.end(),no[i].x);
if(it!=v.begin())
{
v.erase(it-1);
v.push_back(no[i].y);
ans++;
}
}
printf("%d\n",ans);
return 0;
}