[编程题] 牛牛找工作

#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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值