1.首先把所有的工作存储起来.

2.我们得思考一下既然是所谓的找赚钱赚多而且能力比难度大的,不免需要排序.无非就是两个排序思路:难度排序,报酬排序

2.1难度排序,此刻然后找到一定比自己能力小的工作了,但是依然需要找难度小中钱最多的

2.2报酬排序,排序好报酬,找哪个工作难度是比我能力小的

3.根据上面两个排序我们其实都可以一一的实现

按照实现简单的报酬排序

1.排序好报酬,按照报酬多的排前面

2.之后我们暴力遍历就行,原因是:我们每次由于是从大到小排序报酬的,不再需要考虑钱的问题,只需要考虑难度的问题,那么遍历得到第一个难度比自己能力小的工作,自然就是我们最心仪的工作了(好真实,我感觉我找工作就是这感觉...)

3.这确实能写出来,但实际是超时的(牛客官方的题解也超时了( ̄_ ̄),但是他没说明,真是的...)

#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;

int main() {
    int N,M;
    cin>>N>>M;
    vector<pair<int,int>> v;
    for(int i=0;i<N;i++)
    {
        int di,pi;
        cin>>di>>pi;
        v.push_back({di,pi});
    }
    sort(v.begin(),v.end(),[&](auto x,auto y)->bool{
        return x.second>y.second;
    });

    for(int i=0;i<M;i++)
    {
        int ai;
        cin>>ai;
        for(int j=0;j<N;j++)
        {
            if(ai>=v[j].first)
            {
                cout<<v[j].second<<endl;
                break;
            }
            if(j==N-1) cout<<0<<endl;
        }
    }
    return 0;
}

实现难度排序

1.我们先对难度从简单到难来进行排序,但是此时还有问题,就是可能我们找到难度合适的,但是不一定是拿钱最多的(纯纯牛马)

2.为此,我们需要对其进行规划,也就是说:"如果我们能干难的,就一定能干简单的",定义一个当前工作报酬最大值用于记录遍历过程的最大报酬,那么对从小到大难度排序的进行遍历,如果"当前难度的报酬比遍历更新的要小(意思就是有更轻松但是钱更多的活),那么此时就需要把当前难度的报酬变成最大报酬(暗指虽然工作难但是钱少,之前看过比较轻松的公司有可以赚更多钱的) ; 当前难度下报酬更高,那么实时更新最大的报酬(活难,但是比之前简单的工作赚的钱都多)"

3.那么对每一个特定能力的朋友找工作,用到双指针,找到难度小于等于并且最接近自己能力的,那么此时的报酬就是"所有比自己能力小的工作中最大的报酬了"

#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;

int main() {
    int N,M;
    cin>>N>>M;
    vector<pair<int,int>> v;
    for(int i=0;i<N;i++)
    {
        int di,pi;
        cin>>di>>pi;
        v.push_back({di,pi});
    }
    sort(v.begin(),v.end(),[&](auto x,auto y)->bool{
        return x.first<y.first;
    });
    int max_pi=0;
    for(int i=0;i<N;i++)
    {
        if(max_pi<v[i].second)
            max_pi=v[i].second;
        else
            v[i].second=max_pi;
    }
    for(int i=0;i<M;i++)
    {
        int ai;
        cin>>ai;
        int left=0,right=N-1,mid=left+(right-left)/2;
        while(left<=right)
        {
            mid=left+(right-left)/2;
            if(ai<v[mid].first)
                right=mid-1;
            else
                left=mid+1;
        }
        if(right>=0) 
            cout<<v[right].second<<endl;
        else 
            cout<<0<<endl;
    }
    return 0;
}