zoukankan      html  css  js  c++  java
  • 优先队列

    优先队列

    优先大的元素出,或者优先小的元素出

    https://blog.csdn.net/yuewenyao/article/details/88764046

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    vector<long long> s, s1, e, e1;
    void sort(int left, int right);
    bool cmp(int wl, int hl, int i);
    priority_queue<long long> q;
    long long ee = 1e+9 + 7;
    
    
    int main()
    {
        int n(0), k(0);
        cin >> n >> k;
        for(int i = 0; i < n; i++) 
        {
            int tmp1(0);
            cin >> tmp1;
            s.push_back(tmp1);
            // s1.push_back(tmp1);
        }
        for(int i = 0; i < n; i++) 
        {
            int tmp2(0);
            cin >> tmp2;
            e.push_back(tmp2);
            // e1.push_back(tmp2);
        }
        int len = e.size();
        sort(0, len-1);
        // for(int i = 0; i < e.size(); i++) cout << e[i] << " ";
        // cout << endl;
        long long sum = 0;
        long long ans = 0;
        for(int i = 0; i < len; i++) // 从效率最高的工人降序选择,第一次只能选	一个,然后两个,三个,...,k个(最多),这个时候用优先队列来进行维护
        {
            sum += s[i];
            q.push(-s[i]);  // 填入负值是和上一个sum语句相关的
            while(q.size() > k)  // 保证最低效率情况下能获得最高的速度
            {
                sum += q.top();
                q.pop();
            }
            ans = max(ans, sum*e[i]);
    
        }
        // cout << ee << endl;
        cout << ans%ee;
        return 0;
    }
    
    
    void sort(int left, int right)  
    {
    if(left >= right) return;
    
    int i = left;
    int j = right;
    int wl = s[left];
    int hl = e[left];
    while(i < j)
    {
        // cout << i << " " << j << " " << left << endl;
        while(i < j && cmp(wl, hl, j)) j--;
        s[i] = s[j];
        e[i] = e[j];
    
        while(i < j && !cmp(wl, hl, i)) i++;
        s[j] = s[i];
        e[j] = e[i];
    }
    // cout << 1 << endl;
    s[i] = wl;
    e[i] = hl;
    sort(left, i-1);
    sort(i+1, right);
    }
    bool cmp(int wl, int hl, int i)
    {
        // if(wl < w[i]) return true;
        // if(wl > w[i]) return false;
        if(hl > e[i]) return true;
        else return false;
    }
  • 相关阅读:
    第四章:文件stat获取函数
    第四章:文件的访问权限
    第三章:ioctl 函数详解
    第三章:fcntl 函数详解
    第四章:用户ID和组ID
    第四章:文件属性更改
    第三章:文件 I/O
    第四章:文件类型
    第二章:Unix的标准化及实现
    xml DOM解析
  • 原文地址:https://www.cnblogs.com/SKEZhi/p/14660176.html
Copyright © 2011-2022 走看看