hdu 5360 Hiking

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int N=100000+5;

struct node
{
    int st,ed,id;
    friend bool operator < (node n1,node n2)
    {
        return n2.ed<n1.ed;
    }
}p[N];

priority_queue<node>q;
bool cmp(node x,node y)
{
    return x.st<y.st;
}

int main()
{
    int _,n,i,j,cnt,use[N],go[N],f;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d",&n);
        memset(use,0,sizeof(use));
        f=1;
        for(i=0;i<n;i++)
            scanf("%d",&p[i].st);
        for(i=0;i<n;i++)
        {
            scanf("%d",&p[i].ed);
            p[i].id=i+1;
        }
        sort(p,p+n,cmp);
        while(!q.empty()) q.pop();

        for(i=0,j=0,cnt=0;i<n;i++)
        {
            while(j<n&&p[j].st==i)
                q.push(p[j++]);
            while(!q.empty()&&q.top().ed<i)
            {
                q.pop();
            }
            if(q.empty()) break;
            go[cnt++]=q.top().id;
            q.pop();
        }

        printf("%d\n",cnt);
        for(i=0;i<cnt;i++)
        {
            use[go[i]]=1;
            if(f==1) {printf("%d",go[i]);f=0;}
              else printf(" %d",go[i]);
        }

        for(i=1;i<=n;i++)
        {
          if(use[i]==0)
          {
              if(f==1) {printf("%d",i);f=0;}
              else printf(" %d",i);
          }
        }

        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 01:45:40

hdu 5360 Hiking的相关文章

hdu 5360 Hiking(优先队列+贪心)

题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L,R](现有L~R个人准备去,那么这个朋友就去). 求最多有多少人去. 及beta邀请朋友的顺序. 分析:每次邀请人的最优解就是:选会去的人里面R最小的那个人. 代码实现的话,cur代表已经准备go hiking的人数,每次将全部L<=cur的人放进优先队列,选出R最小的那个. 假设队列为空,那么剩下

HDU 5360 Hiking (贪心+优先队列)

本文纯属原创,转载注明出处:http://blog.csdn.net/zip_fan.谢谢. 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5360 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Special Judge Problem Description There are n soda conveniently la

HDU 5360 Hiking(优先队列)

Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 492    Accepted Submission(s): 263 Special Judge Problem Description There are  soda conveniently labeled by . beta, their best friends,

HDU 5360——Hiking——————【贪心+优先队列】

Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 118    Accepted Submission(s): 69Special Judge Problem Description There are n soda conveniently labeled by 1,2,…,n. beta, their best fri

HDU 5360 Hiking(线段树)

题意: n个人接受邀请的条件是已经接受邀请的人数区间在l[i] , r[i] 问怎样设置邀请顺序能使得接受邀请的人数最多 解析: 先对区间从小按照右边界从小到大排序,如果右边界相同,再按照左边界从小到大排序.因为右边界越小优先级越高,左边界同理. 如果用优先队列,是算出选择当前人选择哪个区间是最优的. 由于本人不会两个条件的优先队列,所以只能换了一种写法来写. 于是我想到了线段树,逆向思维,利用线段树来维护这个区间选择哪个人是最优的. 选择完这个人之后,将这个人置为无穷大并维护线段树. 并记录下

HDU 5360(2015多校6)-Hiking(优先队列)

题目地址:HDU 5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须满足c>=l[i]&&c<=ri,问你邀请的顺序是什么才能使尽可能多的人去远足,若有多个最优解,输出任意的一个. 思路:先按照L从小到到排序,把当前符合的L放入优先队列中 ,然后对队列中的R从小到大排序,贪心的选择R小的,然后乱搞一番就可以了. #include <stdio.h> #include <math.h> #includ

HDOJ 5360 Hiking 优先队列+贪心

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意: 大概的意思就是每个人有个人数接受范围$[l_i,r_i]$,现在你每次能从还未被选取的人中选择一个人,如果当前人数符合这个人的需求,那么这个人就会被选中.现在让你输出一个选择的序列,使得被选择的人数尽量多. 题解: 就贪心就好,总的来说就是人数不断增大的时候,每次从可行的所有$l$中选择$r$最小的那个.至于为什么这样是最优的..需要脑补. 代码: #include<iostream>

hdu 2425 Hiking Trip

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2425 Hiking Trip Description Hiking in the mountains is seldom an easy task for most people, as it is extremely easy to get lost during the trip. Recently Green has decided to go on a hiking trip. Unfort

HDU 5360 (贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:告诉你n个区间[ l[i],r[i] ],然后让你排序,必须左区间不大于它前边的总区间个数,右区间不小于前边的总区间个数,求该序列的最大长度以及序列: PS:场上做的时候,三个人三个思路,不知道为啥交流不力,就这么放过了这道题目: 我的思路:把每个区间当成一个新的区间,就是第i个区间,能做该序列的第几个区间,这样又是一个区间.比如,(0,2)可以做第1,2,3个区间,即1~3: 但是等我