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;

}


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

相关文章推荐

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

思路:对当前人数进行维护            对于最低要求人数符合当前人数的人,把他加入优先队列进行维护            优先从队列先选择最高要求人数低的人 #include #incl...

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 ...

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:要去旅游有n个人,第i个人接受邀请最少要Li个人已接受邀请,且不能超过Ri个人已...

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
  • 597

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

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

HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6

Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total...

HDU 5360 优先队列

点击打开链接 题意:对于n个人,写出一个选择的顺序使得最后参加的人数最多,对于当前的人,它参加的条件是已经参加的人数要大于等于它的L小于等于它的R,有多种情况满足输出一种既可 思路:想一想如何使得...
  • Dan__ge
  • Dan__ge
  • 2016年07月07日 13:07
  • 246

HDU - 6047 多校2 1003 Maximum Sequence (贪心+优先队列)

Steph is extremely obsessed with “sequence problems” that are usually seen on magazines: Given the s...

Hdu 6047 Maximum Sequence【贪心+优先队列】

Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...

hdu 4544 湫湫系列故事——消灭兔子(优先队列+贪心)

1、http://acm.hdu.edu.cn/showproblem.php?pid=4544 2、题目大意: 湫湫系列故事——消灭兔子 Time Limit: 3000/1000 M...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5360 (贪心 优先队列)
举报原因:
原因补充:

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