zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    java。多态
    java。构造方法
    java.final修饰符l
    java。this的用法
    数据库:内连接与外连接区别
    Java工具类-设置字符编码
    Java工具类-验证码工具
    Java工具类-加密算法
    java中的object... args参数
    针对MySql封装的JDBC通用框架类(包含增删改查、JavaBean反射原理)
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3574411.html
Copyright © 2011-2022 走看看