[优先队列]HDOJ5360 Hiking

题意:有n个人,每个人有两个参数$l$和$r$

邀请他们去hiking, 当  当前已经邀请到的人数大于等于$l$,并且小于等于$r$,那么这个人就会去

问最多能邀请到几个人

并输出 依次要邀请的人的编号(编号1~n)

先要按$l$排序($l$小的在前),因为所有$l$小于等于当前已经邀请到的人数的人才能被邀请

对上述能被邀请的人 要在对$r$排序($r$小的在前), 优先邀请$r$小的

用优先队列搞一下就好了

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=; struct node
{
int l, r;
int id;
friend bool operator < (node a, node b)
{
return a.r>b.r;
}
} a[]; bool cmp(node a, node b)
{
return a.l<b.l;
} int ans[];
bool vis[];
priority_queue<node> q;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
for(int i=; i<=n; i++)
{
a[i].id=i;
a[i].l=read();
scanf("%d", &a[i].l);
}
for(int i=; i<=n; i++)
scanf("%d", &a[i].r);
sort(a+, a++n, cmp);
while(!q.empty()) q.pop();
int cur=, num=;
memset(ans, , sizeof(ans));
memset(vis, , sizeof(vis));
for(int i=; i<n; i++)
{
while(cur<=n && a[cur].l<=i)
q.push(a[cur]), cur++;
while(!q.empty() && q.top().r<i)
q.pop();
if(!q.empty() && q.top().l<=num && q.top().r>=num)
ans[++num]=q.top().id, vis[q.top().id]=, q.pop();
else
break;
}
printf("%d\n", num);
for(int i=; i<=n; i++)
if(!vis[i])
ans[++num]=i;
for(int i=; i<=n; i++)
printf("%d%c", ans[i], (i==n? '\n': ' '));
}
return ;
}

HDOJ 5360

上一篇:App store 如何使用 promo code | app store 打不开精品推荐和排行榜


下一篇:面试题之 query转为obj