美文网首页
CodeForces - 681C 【优先队列】

CodeForces - 681C 【优先队列】

作者: Anxdada | 来源:发表于2017-02-09 20:25 被阅读0次

    传送门
    优先队列在语法(推入,删除)上与普通队列一样,不同在于声明时要这样:priority_queue<int,vector<int>,greater<int> >q;
    优先队列中默认出来的top值为该队列中的最小的数.这道题就是一道模拟优先队列的题.(被人看来是水题,而我却。)
    代码如下:

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int maxn=1000005;
    struct node
    {
        char ch;
        int x;
    }op[maxn];
    
    int main()
    {
        priority_queue<int,vector<int>,greater<int> >q;//优先队列的严格声明方式.
        int n,i,k=0,u;//默认该队列中最小的数为优先级最高的数,即q.top=q.min.
        char s[10];
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            if(s[0]=='i')
            {
                scanf("%d",&u);
                op[k].x=u;
                op[k++].ch='i';
                q.push(u);
            }
            else if(s[0]=='r')
            {
                if(q.empty()){//防止队列为空时,该操作非法;
                    op[k].x=0;
                    op[k++].ch='i';
                    q.push(0);
                }
                q.pop();
                op[k++].ch='r';
            }
            else{
                scanf("%d",&u);//u就是目标数.
                if(!q.empty()&&q.top()==u)
                {
                    op[k].x=u;
                    op[k++].ch='g';
                }
                else if(!q.empty()&&q.top()>u)
                {
                    op[k].x=u;
                    op[k++].ch='i';
                    q.push(u);
                    op[k].x=u;
                    op[k++].ch='g';
                }
                else{
                    while(!q.empty()&&q.top()<u)//删到队列中最小的数小于目标数为止.
                    {
                        op[k].x=q.top();
                        op[k++].ch='r';
                        q.pop();
                    }
                    if(!q.empty()&&q.top()>u || q.empty())
                    {
                        op[k].x=u;
                        op[k++].ch='i';
                        q.push(u);
                    }
                    op[k].x=u;
                    op[k++].ch='g';
                }
            }
        }
        printf("%d\n",k);//总共最少步骤
        for(int i=0;i<k;i++)
        {
            if(op[i].ch=='i')
                printf("insert %d\n",op[i].x);
            else if(op[i].ch=='r')
                printf("removeMin\n");
            else
                printf("getMin %d\n",op[i].x);
        }
    }
    

    相关文章

      网友评论

          本文标题:CodeForces - 681C 【优先队列】

          本文链接:https://www.haomeiwen.com/subject/itywittx.html