hdu5360--Hiking(优先队列)

题目链接:点击打开链接

题目大意:邀请n个人去旅游,给出每个人同意邀请时对人数的限制条件:最小人数和最大人数,一旦接收邀请就不会再退出,求一个序列,在这个序列中可以邀请到最多的人去旅游。

首先对n个人的最小人数限制由小到大排序,记录当前已经接受邀请的人数,然后将满足最小人数的人加入优先队列,优先队列按照最大人数由小到大排列,每次吐出的都是最大人数限制的最小值,如果当前的人数小于等于最大的人数就可以邀请到,否则就邀请不到。每当接受邀请的人数增加,就循环一次,直到所有人都遍历完。

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std ;
struct node{
    int s , e , id ;
    bool operator < (node a) const {
        return e > a.e ;
    }
}p[100010] , q ;
priority_queue <node> que ;
int vis[100010] ;
vector<int> vec ;
int cmp(node a,node b) {
    return a.s < b.s ;
}
int main() {
    int t , n , i , j , num ;
    scanf("%d", &t) ;
    while( t-- ) {
        while( !que.empty() ) que.pop() ;
        memset(vis,0,sizeof(vis)) ;
        vec.clear() ;
        scanf("%d", &n) ;
        for(i = 0 ; i < n ; i++) {
            scanf("%d", &p[i].s) ;
            p[i].id = i+1 ;
        }
        for(i = 0 ; i < n ; i++)
            scanf("%d", &p[i].e) ;
        sort(p,p+n,cmp) ;
        num = 0 ; i = 0 ;
        for(j = 0 ; j < n ; j++) {
            while( i < n ) {
                if( p[i].s <= num ) {
                    que.push(p[i]) ;
                    i++ ;
                }
                else break ;
            }
            while( !que.empty() ) {
                if( que.top().e >= num ) {
                    vec.push_back( que.top().id ) ;
                    vis[ que.top().id ] = 1 ;
                    que.pop() ;
                    num++ ;
                    break ;
                }
                else
                    que.pop() ;
            }
        }
        int cnt = 0 ;
        printf("%d\n", vec.size()) ;
        for(i = 0 ; i < vec.size() ; i++) {
            cnt++ ;
            if( cnt == n )
                printf("%d\n", vec[i]) ;
            else
                printf("%d ", vec[i]) ;
        }
        for(i = 1 ; i <= n ; i++) {
            if( vis[i] ) continue ;
            cnt++ ;
            if( cnt == n )
                printf("%d\n", i) ;
            else
                printf("%d ", i) ;
        }
    }
    return 0 ;
}

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

时间: 2024-11-13 03:57:27

hdu5360--Hiking(优先队列)的相关文章

hdu5360 Hiking(水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 724    Accepted Submission(s): 384Special Judge Problem Description There are 

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最小的那个. 假设队列为空,那么剩下

HDU5360 Hiking

1.题目描述:点击打开链接 2.解题思路:本题利用优先队列解决,然而在这次多校的比赛时候并没有往这个角度考虑,最终要么WA要么TLE==.其实本题的贪心策略很好想:如果把题目中的人数看做数轴上的点的话,那么应该按照从0依次递增的顺序来选择区间,把符合条件的区间预先存起来,然后按照他们的终点由小到大排序,第一个就是我们要的区间,如果遇到第一个区间的终点也小于当前值,那么也将他放入ans数组,只不过被邀请的人数不变而已.显然,看到这种思路就应当往优先队列的角度考虑.这里应当首先对区间按照起点大小排序

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>

hdu5360 (贪心+优先队列)

做法是每次选取起始条件符合,并且结束条件最早的.(每个人的起始时间为l,结束时间为r) #include <iostream> #include <stdio.h> #include <memory.h> #include <queue> #include <vector> using namespace std; int N,T; struct node { int start; int End; int index; bool friend

HDU5360——优先队列——Hiking

Problem Description There are n soda conveniently labeled by 1,2,…,n. beta, their best friends, wants to invite some soda to go hiking. The i-th soda will go hiking if the total number of soda that go hiking except him is no less than li and no large

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 (贪心+优先队列)

本文纯属原创,转载注明出处: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,