HDU 5360 (贪心 优先队列)

原创 2016年05月31日 22:18:08

Hiking

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1370    Accepted Submission(s): 711
Special Judge


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 larger than ri. beta will follow the rules below to invite soda one by one:
1. he selects a soda not invited before;
2. he tells soda the number of soda who agree to go hiking by now;
3. soda will agree or disagree according to the number he hears.

Note: beta will always tell the truth and soda will agree if and only if the number he hears is no less than li and no larger than ri, otherwise he will disagree. Once soda agrees to go hiking he will not regret even if the final total number fails to meet some soda's will.

Help beta design an invitation order that the number of soda who agree to go hiking is maximum.
 

Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:

The first contains an integer n (1n105), the number of soda. The second line constains n integers l1,l2,,ln. The third line constains n integers r1,r2,,rn(0lirin)
It is guaranteed that the total number of soda in the input doesn't exceed 1000000. The number of test cases in the input doesn't exceed 600.
 

Output
For each test case, output the maximum number of soda. Then in the second line output a permutation of 1,2,,n denoting the invitation order. If there are multiple solutions, print any of them.
 

Sample Input
4 8 4 1 3 2 2 1 0 3 5 3 6 4 2 1 7 6 8 3 3 2 0 5 0 3 6 4 5 2 7 7 6 7 6 8 2 2 3 3 3 0 0 2 7 4 3 6 3 2 2 5 8 5 6 5 3 3 1 2 4 6 7 7 6 5 4 3 5
 

Sample Output
7 1 7 6 5 2 4 3 8 8 4 6 3 1 2 5 8 7 7 3 6 7 1 5 2 8 4 0 1 2 3 4 5 6 7 8
 


题意:每个人都有一个答应的区间,如果邀请他的时候答应的人数在区间内,

他就会答应.求使得答应人数最多的邀请顺序.

考虑这样的贪心:对于所有左区间满足的人中选择右区间最小的.这样就可以用

一个优先队列维护可行的人了.最后把剩下的人放最后一起输出.

#include <bits/stdc++.h>
using namespace std;
#define maxn 111111

struct node {
    int x, y;
    int id;
    bool operator < (const node &a) const {
        return x < a.x || (x == a.x && y < a.y);
    }
}p[maxn];
bool cmp (const node &a, const node &b) {
    return a.id < b.id;
}
vector <int> ans;
bool vis[maxn];
int cnt, n;
struct node2 {
    int num, id;
    bool operator < (const node2 &a) const {
        return num > a.num;
    }
};
priority_queue <node2> gg;

int main () {
    int t;
    scanf ("%d", &t);
    while (t--) {
        scanf ("%d", &n);
        ans.clear ();
        for (int i = 1; i <= n; i++) {
            scanf ("%d", &p[i].x);
        }
        for (int i = 1; i <= n; i++) {
            scanf ("%d", &p[i].y);
            p[i].id = i;
        }
        sort (p+1, p+n+1);
        int cnt = 0;
        while (!gg.empty ()) gg.pop ();
        int i = 1;
        for (; (i <= n && p[i].x <= cnt) || !gg.empty ();) {
            while (i <= n && p[i].x <= cnt) {
                gg.push ((node2) {p[i].y, p[i].id});
                i++;
            }
            while (!gg.empty () && gg.top().num < cnt) {
                gg.pop ();
            }
            if (!gg.empty ()) {
                ans.push_back (gg.top().id);
                cnt++;
                gg.pop ();
            }
        }
        memset (vis, 0, sizeof vis);
        printf ("%d\n", cnt);
        for (int i = 0; i < cnt; i++) vis[ans[i]] = 1;
        for (int i = 1; i <= n; i++) if (!vis[i]) {
            ans.push_back (i);
        }
        printf ("%d", ans[0]);
        for (int i = 1; i < n; i++) printf (" %d", ans[i]);
        printf ("\n");
    }
    return 0;

}


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

蓝桥杯 算法提高 排队打水问题(贪心排序+优先队列)

算法提高 排队打水问题   时间限制:1.0s   内存限制:256.0MB      问题描述   有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………...
  • Sterben_Da
  • Sterben_Da
  • 2016年01月22日 15:50
  • 2276

HDU 6000 Wash (优先队列-贪心)

题意: 你有L件衣服, 有n 个洗衣机, m 个烘干机, 告诉你每个洗衣机的洗衣服的时间,和每个烘干机的烘干时间, 每个机器 一个时间段只能处理一件衣服,问洗完这L 件衣服最短时间是多少? 思路:...
  • aozil_yang
  • aozil_yang
  • 2017年04月01日 11:41
  • 1271

POJ1456Supermarket(贪心+优先队列)

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9103   Ac...
  • u010372095
  • u010372095
  • 2014年08月11日 22:47
  • 1238

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

本文纯属原创,转载注明出处:http://blog.csdn.net/zip_fan。谢谢。 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5360...
  • u014705673
  • u014705673
  • 2015年08月07日 17:00
  • 362

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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:beta有n个朋友,beta要向邀请他的朋友go hiking,已知每个朋友的理想人数[L,R...
  • w20810
  • w20810
  • 2015年08月06日 23:00
  • 621

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:要去旅游有n个人,第i个人接受邀请最少要Li个人已接受邀请,且不能超过Ri个人已...
  • csdn364988181
  • csdn364988181
  • 2016年06月02日 12:29
  • 168

2015 多校联赛 ——HDU5360(贪心+优先队列)

Sample Input 4 8 4 1 3 2 2 1 0 3 5 3 6 4 2 1 7 6 8 3 3 2 0 5 0 3 6 4 5 2 7 7 6 7 6 8 2 2 3 3 3 0 ...
  • Fun_Zero
  • Fun_Zero
  • 2015年08月07日 10:56
  • 243

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

思路:对当前人数进行维护            对于最低要求人数符合当前人数的人,把他加入优先队列进行维护            优先从队列先选择最高要求人数低的人 #include #incl...
  • Slow_Wakler
  • Slow_Wakler
  • 2015年08月12日 21:39
  • 310

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

题目地址:HDU 5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须满足c>=l[i]&&c...
  • u013486414
  • u013486414
  • 2015年08月07日 15:08
  • 440

HDU 5360 优先队列

点击打开链接 题意:对于n个人,写出一个选择的顺序使得最后参加的人数最多,对于当前的人,它参加的条件是已经参加的人数要大于等于它的L小于等于它的R,有多种情况满足输出一种既可 思路:想一想如何使得...
  • Dan__ge
  • Dan__ge
  • 2016年07月07日 13:07
  • 265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5360 (贪心 优先队列)
举报原因:
原因补充:

(最多只允许输入30个字)