hdu5360(优先队列)

来源:互联网 发布:玫瑰花淘宝 编辑:程序博客网 时间:2024/05/29 08:51

链接:点击打开链接

题意:n个人去旅游,给出每个人可以参加旅游的最小人数和最大人数,只有在这个区间内这个人才可以参加,问最多参加的人数,并输出任意一种方案

代码:

#include <queue>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;struct node{    int r,id;    friend bool operator<(node a,node b){        return a.r>b.r;    }};int l[100005],r[100005],sign[100005];int main(){    int t,n,i,j;    scanf("%d",&t);    while(t--){        queue<int> ans;        priority_queue<node> tmp,q[100005];        scanf("%d",&n);        for(i=1;i<=n;i++)        scanf("%d",&l[i]);        for(i=1;i<=n;i++)        scanf("%d",&r[i]);        for(i=1;i<=n;i++){                      //把每个左区间存起来        q[l[i]].push((node){r[i],i});        sign[i]=0;        }        i=0;        while(i<=n){                            //每次进一个,然后选r小的先出队列            while(q[i].size()){                 //然后把左区间符合的都压入队列                tmp.push(q[i].top());                q[i].pop();            }            if(tmp.size()==0)            break;            if(tmp.top().r>=i){            ans.push(tmp.top().id);            i++;            }            tmp.pop();        }        printf("%d\n",ans.size());        while(ans.size()){            sign[ans.front()]=1;            printf("%d ",ans.front());            ans.pop();        }        for(i=1;i<=n;i++)        if(!sign[i])        printf("%d ",i);        printf("\n");    }    return 0;}

0 0
原创粉丝点击