zoukankan      html  css  js  c++  java
  • 队列+排序(送礼物)

    阿丽莎公主邀请她的朋友们参加她的生日聚会。她的每个朋友都会带来价值v的礼物,而他们所有的礼物都会在不同的时间出现。由于大厅不够大,因此Alisha一次只能容纳几个人。她决定让具有最高价值的礼物的人首先进入。
    每次Alisha打开门时,她都可以决定让p个人进入她的城堡。如果大厅中的人数少于p,则所有人员都会进入。在她所有的朋友都到达之后,阿里沙(Alisha)将再次打开门,这次,每个尚未进入的朋友都会进入。
    如果有两个朋友带来了相同价值的礼物,那么最先出现的那个应该首先进入。给定一个查询n,请告诉Alisha谁是进入城堡的第n个人。

    输入项
    输入的第一行给出测试用例的数量T,其中1≤T≤15。
    在每个测试用例中,第一行包含三个数字k,m和q,并用空格分隔。 k是她邀请的朋友数,其中1≤k≤150,000。在所有Alisha的朋友到达0≤m≤k之前,门会打开m次。 Alisha将有q个查询,其中1≤q≤100。
    接下来的k行中的第i行给出了一个字符串Bi,该字符串由不超过200个英文字符组成,并且整数vi(1≤vi≤108)用空格分隔。 Bi是参加Alisha派对的第i个人的名字,Bi带来了价值vi的礼物。
    接下来的m行中的每行包含两个整数t(1≤t≤k)和p(0≤p≤k),中间用空格分隔。第t个人到达后,门将打开,Alisha将让p个朋友进入她的城堡。
    每个测试用例的最后一行将包含q个数字n1,…,nq,以空格分隔,这意味着Alisha想要知道谁是进入她城堡的第n1,...,nq个朋友。
    注意:最多将有两个包含n> 10000的测试用例。

    输出量
    对于每个测试用例,输出对应的Alisha查询名称,并用空格分隔。

    1
    5 2 3
    Sorey 3
    Rose 3
    Maltran  3
    Lailah 5
    Mikleo  6
    1 1
    4 2
    1 2 3
    Output
    Sorey Lailah Rose

    Source

    2015 ACM/ICPC Asia Regional Changchun Online

    就是排序

    #pragma GCC optimize(2)
    #include<cstdio>
    #include<iostream> 
    #include<algorithm>
    #include<map>
    #include<string> 
    #include <math.h> 
    #include<memory.h>
    #include<cstring>
    #include<bits/stdc++.h>
    using namespace std; 
    typedef long long ll; 
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=2e5+110;
    struct node{
        char name[200];
        int vis;//标号 
        int val;// 
        friend bool operator<(node x,node y){
            if(x.val==y.val){
                return x.vis>y.vis;
            }
            else{
                return x.val<y.val;
            }
        }
    }a[maxn];
    node now;
    int mm[maxn];
    struct node1{
        int km,rs;
    }aa[maxn];
    bool cmp(node1 x,node1 y){
        return x.km<y.km;
    }
    int p[maxn]; 
    int z[maxn];
    int main(){
        int t;
        cin>>t;
        while(t--){
            priority_queue<node>q1;
            int n,m,k;
            scanf("%d%d%d",&n,&m,&k);
            for(int i=1;i<=n;i++){
                scanf("%s%d",a[i].name,&a[i].val);
            }
            for(int i=1;i<=m;i++){
                scanf("%d%d",&aa[i].km,&aa[i].rs);
            }
            sort(aa+1,aa+m+1,cmp);
            int cnt=1;
            int top=1;
            for(int i=1;i<=m;i++){
                while(cnt<=aa[i].km){//进队列 
                    strcpy(now.name,a[cnt].name);
                    now.val=a[cnt].val;
                    now.vis=cnt;
                    cnt++;
                    q1.push(now);
                }
                while(aa[i].rs&&!q1.empty()){//出队列 
                    aa[i].rs--;
                    mm[top++]=q1.top().vis;
                    q1.pop();    
                }
            }
            while(cnt<=n){//m次处理完后,最后剩下的全都要弄一下 
                strcpy(now.name,a[cnt].name);
                now.val=a[cnt].val;
                now.vis=cnt;
                q1.push(now);
                cnt++; 
            }
            while(!q1.empty()){
                mm[top++]=q1.top().vis;
                q1.pop();
            }
            int l;
            for(int i=0;i<k;i++){
                scanf("%d",&l);
                if(i)
                    printf(" ");
                printf("%s",a[mm[l]].name);
            }
            if(t>=1) 
                cout<<endl;
            }
    }
  • 相关阅读:
    从上往下打印二叉树
    栈的压入、弹出序列
    连续子数组的最大和
    链表中环形的入口
    1月项目痛点
    problem:vue组件局部刷新,在组件销毁(destroyed)时取消刷新无效问题
    重点:浏览器的工作原理
    12月中旬项目中出现的几个bug解决方法的思考
    12月中项目问题复盘之对项目进度把控的反思
    problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题
  • 原文地址:https://www.cnblogs.com/lipu123/p/13658595.html
Copyright © 2011-2022 走看看