模拟 - hdu5360 Hiking

来源:互联网 发布:淘宝上好的外贸店 编辑:程序博客网 时间:2024/06/05 14:47

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5360


题意:

某君要邀请n个人去郊游,每个人都有奇特的要求,对于第i个人,只有当前答应去郊游的人数cur满足MIN[i]<=cur<=MAX[i],他才会答应参加,并且参加后不会反悔,问最多能邀请到多少人去郊游,并给出任意满足题意邀请序列


思路:

先依据所有人min进行排序,当邀请人数为cur时,把数组里所有min等于cur的人放入优先队列,邀请队列中max最小,且max<=cur的那个人


代码:

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<functional>#pragma comment(linker, "/STACK:102400000,102400000")//C++using namespace std;const double PI = 3.141592653589793238462643383279502884197169399;const int MAXINT = 0x7fffffff;const int MAXSIZE = 100000 + 5;const long long INF = 0x7FFFFFFFFFFFFFFF;struct node{    int num;    int l,r;};bool operator <(const node&p1, const node&p2){return p1.r>p2.r;}void quick_sort(node arr[],int l,int r){    int i=l,j=r;    int x=arr[(l+r)>>1].l;    while (i<=j){        while (arr[i].l<x) i++;        while (arr[j].l>x) j--;        if (i<=j){            swap(arr[i],arr[j]);            i++;            j--;        }    }    if (i<r) quick_sort(arr,i,r);    if (l<j) quick_sort(arr,l,j);}node arr[MAXSIZE];vector<int> ans;priority_queue<node> Q;int main(){    int total;    cin>>total;    while (total--){        int n;        scanf("%d",&n);        for (int i=0;i<n;++i){            scanf("%d",&arr[i].l);            arr[i].num = i+1;        }        for (int i=0;i<n;++i){            scanf("%d",&arr[i].r);        }        quick_sort(arr,0,n-1);        int cur=0;        int k=0;        ans.clear();        while (!Q.empty()) Q.pop();        while (arr[k].l == 0) {            Q.push(arr[k]);            k++;        }        while (!Q.empty()){            while (!Q.empty()){                if (Q.top().r<cur) {                    ans.push_back(Q.top().num);                    Q.pop();                }                else break;            }            if (!Q.empty()){                ans.push_back(Q.top().num);                Q.pop();                cur++;                //cout<<cur<<" "<<ans[ans.size()-1]<<endl;            }            while (arr[k].l == cur) {                Q.push(arr[k]);                k++;            }        }        while (k<=n-1) {ans.push_back(arr[k].num);k++;}        printf("%d\n",cur);        for (int i=0;i<ans.size()-1;++i){            printf("%d ",ans[i]);        }        printf("%d\n",ans[ans.size()-1]);    }    return 0;}


0 0