• POJ 1442 Black Box -优先队列


    优先队列。。刚开始用蠢办法,经过一个vector容器中转,这么一来一回这么多趟,肯定超时啊。

    超时代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <cstdlib>
    #include <string>
    #include <vector>
    #include <map>
    #include <queue>
    #include <functional>
    using namespace std;
    #define N 30003
    
    priority_queue<int,vector<int>,greater<int> > que;
    int A[N];
    vector<int> tmp;
    
    int main()
    {
        int m,n,i,j,th,u,k,h;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            th = 0;
            for(i=0;i<m;i++)
                scanf("%d",&A[i]);
            j = 0;
            k = 0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&u);
                while(j<u)
                {
                    que.push(A[k++]);
                    j++;
                }
                th++;
                for(h=1;h<th;h++)
                {
                    tmp.push_back(que.top());
                    que.pop();
                }
                printf("%d
    ",que.top());
                for(h=0;h<tmp.size();h++)
                    que.push(tmp[h]);
                tmp.clear();
            }
        }
        return 0;
    }
    View Code

    后来看了网上某位大牛的,说是用两个优先队列,一个从大到小的,一个从小到大的,元素在这两个中间中转,可以大大缩短时间。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <map>
    #include <queue>
    #include <functional>
    using namespace std;
    #define N 30003
    
    priority_queue<int,vector<int>,greater<int> > StoBig;  //从小到大排,先出小的
    priority_queue<int,vector<int>,less<int> > BtoSmall;    //从大到小排,先出大的
    int A[N];
    
    int main()
    {
        int m,n,i,j,th,u,k,h;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            th = 0;
            for(i=0;i<m;i++)
                scanf("%d",&A[i]);
            j = 0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&u);
                while(j<u)
                    BtoSmall.push(A[j++]);
                th++;
                while(BtoSmall.size() >= th)  //语句1
                {
                    StoBig.push(BtoSmall.top());
                    BtoSmall.pop();
                }
                printf("%d
    ",StoBig.top());
                BtoSmall.push(StoBig.top());   //还给它,保证语句1能够成立
                StoBig.pop();
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    一些误解和错误的看法
    负载均衡了解
    《网络编程》守护进程
    Cocos2d-x 3.2编译Android程序错误的解决方案
    ArcMap合并之路 -- 该段路合并成一个完整的路
    让你提前知道软件开发(24):C语言和主要特征的历史
    Java中的TCP/UDP网络通信编程
    Android中Socket大文件断点上传
    android 自定义progressDialog实现
    开发Mhealth(即:Mobile Health 移动医疗)应用必知的10个掘金点
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3574411.html
Copyright © 2020-2023  润新知