题意
输出能完成的最大任务数
思路
一开始写了二分 + DFS,果断TLE。
后来想了很久也没想到什么好办法,参考了别人的思路。
这思路也挺神奇的,用优先队列维护一个最大任务时间。
先排序
如果加上curLast(当前任务持续时间)会超出curDeath,就pop掉队里的最大Last。
对此我想(ma)了(hou)想(pao)。如果curLast小于maxLast,显然把maxLast的那个任务不选,选择当前的这个任务较优。因为这样不仅能多放一个任务,还可以给后面腾出时间。
如果curLast > maxLast,那么不管替换还是不替换,不选择的任务数始终会增加一个。而且当后面任务来的时候总要被替换下来。
所以最后统计出的是被换下的任务数,用总数减一下就行。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 800000 + 5;
int T,n;
struct node
{
int l,r;
} a[maxn];
bool cmp(node a,node b)
{
return a.r < b.r ;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a,a+n,cmp);
priority_queue<int> q;//优先队列(降序)
int ans = 0,time = 0;
for(int i=0; i<n; i++)
{
q.push(a[i].l);
int t = q.top();
time += a[i].l;
ans ++;
if(time > a[i].r)
{
time -= t;
q.pop();
ans --;
}
}
printf("%d\n",ans);
if(T)
{
printf("\n");
}
}
return 0;
}