[编程题] 牛牛找工作

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct work{
    int hard;
    int pay;
    work(int a, int b) :hard(a), pay(b){}
};

int main() {
    int num_work = 0, num_f = 0;
    cin >> num_work >> num_f;
    int i = num_work;
    vector<work> v;
    while (i) {
        int hard = 0, pay = 0;
        cin >> hard >> pay;
        v.push_back(work(hard, pay));
        --i;
    }
    int py = 0;
    vector<int> A;
    while (cin >> py)
        A.push_back(py);
    sort(v.begin(),v.end(), [] (const work& a,const work& b) {
        if (a.hard < b.hard)
            return true;
        else if (a.hard == b.hard)
            return a.pay > b.pay;
        else return false;
    });
    for (int each : A) {
        int maxpay = 0;
        for (work w : v) {
            if (w.hard <= each)
                maxpay = max(maxpay,w.pay);
            else break;
        }
        cout << maxpay << endl;
    }
    return 0;
}

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

  • 一开始采用的是暴力寻找
  • 搜索到最大价值的复杂度为o(m*n)
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;


int main() {
    int num_work = 0, num_f = 0;
    cin >> num_work >> num_f;

    map<int, int> table;

    while (num_work) {//根据输入工作的数量读取对应的信息到map当中
        int hard = 0, pay = 0;
        cin >> hard >> pay;
        table[hard] = max(table[hard], pay);//对于同样难度的工作只保存最大价值
        --num_work;
    }

    int py = 0;
    vector<int> A;//保存输入的每个同伴的能力指数
    vector<pair<int, int>> v;

    while (cin >> py)//读取每个伙伴的能力指数
        A.push_back(py);

    for (auto each : table) {//将map当中每个pair对保存到数组当中 用于之后的处理
        v.push_back(each);
    }
    //将所有的任务按照难度从小到大排序
    sort(v.begin(), v.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
        return a.first < b.first;
    });
    //遍历数组,first表示拥有的能力,对应的second表示拥有该能力可以获得最大价值
    //目前的最大价值为前面的最大价值和这个难度的任务的价值的最大值。
    int pre = v[0].second;
    for (int i = 0; i < v.size(); ++i) {
        if (v[i].second > pre)
            pre = v[i].second;
        else
            v[i].second = pre;
    }
    //采用二分搜索出每个人能力对应的数组当中的下界 该下界的价值就是所需的最大价值
    for (int each : A) {
        int begin = 0, end = v.size() - 1, mid = 0;
        while (begin <= end) {
            mid = begin + (end - begin) / 2;
            if (v[mid].first > each) {
                end = mid - 1;
            }
            else
                begin = mid + 1;
        }
        cout << v[end].second << endl;;
    }
    return 0;
}

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

  • 经过处理之后搜索到最大价值的时间复杂度为o(nlog(m))
  • 空间复杂度为o(m)
全部评论

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
4 4 评论
分享
牛客网
牛客企业服务