• 牛牛找工作


    题目描述

    为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

    输入描述:

    每个输入包含一个测试用例。
    每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
    接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
    接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
    保证不存在两项工作的报酬相同。

    输出描述:

    对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
    示例1

    输入

    复制
    3 3 
    1 100 
    10 1000 
    1000000000 1001 
    9 10 1000000000

    输出

    复制
    100 
    1000 
    1001


    1、蛮力法

    复杂度M*N,只能通过40%的样例;
    #include<iostream>
    #include<vector>
    using namespace std;
    int main(){
        int M, N;
        cin >> M >> N;
        vector<int>a, b;
        int company, pay;
        int member;
        for (int i = 0; i < N; i++){
            cin >> company >> pay;
            a.push_back(company);
            b.push_back(pay);
        }
        for (int i = 0; i < M; i++){
            cin >> member;
            int maxpay = 0;
            for(int j = 0; j < N; j++){
                if (a[j] <= member){
                    if(b[j] > maxpay)
                        maxpay = b[j];
                }
            }
            cout << maxpay << endl;
        //    c.push_back(member);
        }
        system("pause");
        return 0;
            
    }
    

      方法二:参考题解:

    链接:https://www.nowcoder.com/questionTerminal/46e837a4ea9144f5ad2021658cb54c4d?f=discussion
    来源:牛客网
    复杂度为max(O(M+N), O(N*logN),O(M*logM));

    先按工作难度进行排序,O(NlogN)。工作难度大的工资包括工作难度小的最大工资。

    然后对能力进行排序。O(MlogM)

    然后两个升序数组进行对应,需O(M+N)

    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
    //对pair的第一个元素进行排序。
    bool cmp(pair<int,int>a,pair<int,int>b)
    {
        return a.first < b.first;
    }
    int main() {
        int n, m;
        cin >> n >> m;
            // job储存工作;guy储存排序后的人;map储存原顺序的人的最高工资
            vector<pair<int, int> > job(n + 1), guy(m);
            vector<int> map(m);
            int mx = 0, index = 0, left = 0;
            job[0] = make_pair(0, 0);
            for(int i = 1; i <= n; ++ i) {
                cin >> job[i].first >> job[i].second;
            }
            for(int i = 0; i < m; ++ i) {
                cin >> guy[i].first;
                guy[i].second = i;
            }
            //对job按工作难度进行排序,对guy进行排序
            sort(job.begin(), job.end(), cmp);
            sort(guy.begin(), guy.end(), cmp);
            //工作难度大的能获得工资包括比他小的工资。
            for(int i = 0; i <= n; ++ i) {
                mx = max(mx, job[i].second);
                job[i].second = mx;
            }
    
            while(left < m && index < n + 1) {
                if(guy[left].first >= job[index].first) ++ index;
                else {
                    map[guy[left].second] = job[index - 1].second;
                    ++ left;
                }
               // cout << index << left << job[index].first << endl;
            }
            for(int i = left; i < m; ++ i) {
                map[guy[i].second] = job[n].second;
            }
            for(int i = 0; i < m; ++ i) {
                cout << map[i] << endl;
            }
        system("pause");
        
    }
    

      



  • 相关阅读:
    尝试一个“建立知识”的过程
    webscheduler 开源定时服务和延迟服务
    两款自定义表单设计器
    IIS应用池保持激活工具开发
    写文章 使用conda管理python环境
    conda 虚拟环境
    Java设计模式
    转:数据标准化/归一化normalization
    转:理解矩阵
    转:为何梯度反方向是函数值下降最快的方向
  • 原文地址:https://www.cnblogs.com/Aliencxl/p/11876229.html
Copyright © 2020-2023  润新知