2019校招真题编程(一)牛牛找工作

题目介绍

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

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

我的思路

贪心算法: 按工作报酬大小从大到小排序;当报酬一定时,按照工作能力从小到大排序;

#include<iostream>

#include <algorithm>  
#include<vector>

using namespace std;

bool cmp(const pair<int,int> &p1,const pair<int,int> &p2)
{
    if(p1.second!=p2.second)
        return p1.second>p2.second;
    else
        return p1.first<p2.first;
}


int main(){
    int n=0, m=0;
    //cout<<"please enter n and m"<<endl;
    cin>>n;
    cin>>m;
    vector<pair<int, int>>works;
    //cout<<"please enter works"<<endl;
    for(int i=0; i<n; i++)
    {
        pair<int, int>tmp;
        cin>>tmp.first;
        cin>>tmp.second;
        works.push_back(tmp);
    }
    vector<int>A(m, 0);
    vector<int>Money(m, 0);
    //cout<<"please enter Ai"<<endl;
    for(int i=0; i<m; i++)
    {
        cin>>A[i];
    }
    
    sort(works.begin(), works.end(), cmp);
    
    for(int i=0; i<m; i++)
    {
        for(auto iter: works)
        {
            if(iter.first<=A[i])
            {
                Money[i]=iter.second;break;
            }
        }
    }
    for(int i=0; i<m; i++)
    {
        cout<<Money[i]<<endl;
    }
    return 0;
}

测试结果:

不通过
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为80.00%

解决方法

同时将works和ai排序;

  1. 工作按照工作难度排序;
  2. 工人按照工作能力从小到大排序
  3. 当第i个人选择完工作后,第i+1个人从第i个人选择的工作开始选择(要么选择当前工作要么选择接下来的工作)
  4. 总的复杂度就是max{O(nlogn), O(mlogm), O(m+n)} < O(mn)
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

bool cmpWorks(const pair<int,int> &p1,const pair<int,int> &p2)
{
        return p1.first<p2.first;
}

bool cmpAi(const pair<int,int> &p1,const pair<int,int> &p2)
{
    return p1.second<p2.second;
}

int main(){
    int n=0, m=0;
    //cout<<"please enter n and m"<<endl;
    cin>>n;
    cin>>m;
    vector<pair<int, int>>works;
    //cout<<"please enter works"<<endl;
    works.push_back(make_pair(0, 0));
    
    for(int i=0; i<n; i++)
    {
        pair<int, int>tmp;
        cin>>tmp.first;
        cin>>tmp.second;
        works.push_back(tmp);
    }
    vector<pair<int, int>>A;
    vector<int>Money(m, 0);
    //cout<<"please enter Ai"<<endl;
    
    for(int i=0; i<m; i++)
    {
        pair<int, int>tmp;
        tmp.first=i;
        cin>>tmp.second;
        A.push_back(tmp);
    }
    
    sort(works.begin(), works.end(), cmpWorks);
    
    sort(A.begin(), A.end(), cmpAi);
    
    for(int i=1; i<=n; i++)
    {
        works[i].second = max(works[i-1].second, works[i].second);
    }
    
    int j=1, maxValue=0;
    for(int i=0; i<m; i++)
    {
        while(j<=n && works[j].first <= A[i].second)
        {
            maxValue = works[j].second;
            j++;
        }
        Money[A[i].first] = maxValue;
    }
    
    for(int i=0; i<m; i++)
    {
        cout<<Money[i]<<endl;
    }

    return 0;
    
}
发布了68 篇原创文章 · 获赞 2 · 访问量 6170

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/104107769