题目练习——牛牛找工作

文章目录[x]
  1. 1:题目内容
  2. 1.1:题目描述
  3. 1.2:输入描述:
  4. 1.3:输出描述:
  5. 2:示例
  6. 2.1:输入
  7. 2.2:输出
  8. 3:第一次:
  9. 4:第二次:
  10. 5:第三次(网上查询):

题目

题目内容

题目描述

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

输入描述:

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

输出描述:

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

示例

输入

3 3 
1 100 
10 1000 
1000000000 1001 
9 10 1000000000

输出

100 
1000 
1001

题目链接:https://www.nowcoder.com/practice/46e837a4ea9144f5ad2021658cb54c4d?tpId=98&tqId=32824&tPage=1&rp=1&ru=/ta/2019test&qru=/ta/2019test/question-ranking

https://www.nowcoder.com/practice/46e837a4ea9144f5ad2021658cb54c4d?tpId=98&tqId=32824&tPage=1&rp=1&ru=/ta/2019test&qru=/ta/2019test/question-ranking

 

第一次:

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

typedef struct job{
    int Di;
    int Pi;
}j,*pj;

int main(){
    int m,n;
    cin>>n>>m;
    int *ability=new int[m];
    vector<pj> job_info;
    for(int i=0;i<n;i++){
        pj node=(pj)malloc(sizeof(j));
        cin>>node->Di>>node->Pi;
        job_info.push_back(node);
    }
    for(int i=0;i<m;i++)
        cin>>ability[i];
    int max=0;
    for(int i=0;i<m;i++){
        for(int k=0;k<n;k++){
            if (ability[i]>=job_info[k]->Di)
                if (job_info[k]->Pi>max)
                    max=job_info[k]->Pi;
        }
        cout<<max<<endl;
        max=0;
    }
}

 

第二次:

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main(){
    unsigned int n,m;
    cin>>n>>m;
    unsigned int *data=new unsigned int[2*n+m];
    for(int i=m;i<2*n+m;i++)
        cin>>data[i];
    for(int i=0;i<m;i++)
        cin>>data[i];
    unsigned int max=0;
    for(int i=0;i<n;i++){
        int Di=n,Pi=n+1;
        while(Pi<=2*n+m-1){
            if(data[i]>=data[Di])
                if(max<data[Pi])
                    max=data[Pi];
            Di+=2;
            Pi+=2;
        }
        cout<<max<<endl;
        max=0;
    }
}

 

经过这两次后,我发现仅能完成40%的用例,剩下的60%因为程序结构过复杂,导致运行时间超时,未能通过。

经过网上查询后,我了解到了贪心算法的概念,下面是我查到的答案:

第三次(网上查询):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
struct job {    //工作
    int Di;//难度
    int Pi;//报酬
} Job[100001];
 
struct ai {   //人
    int i;//序号
    int power;//能力
    int money=0;//报酬
} Ai[100001];
 
bool cmp(struct job a, struct job b) {
    return a.Di < b.Di; //难度
}
 
bool cmp2(struct ai a, struct ai b) {
    return a.power < b.power; //能力
}
 
bool cmp3(struct ai a, struct ai b) {
    return a.i < b.i; //序号
}
 
int main() {
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        for (int i = 0; i < n; i++) {  //n为工作数量
            cin >> Job[i].Di;
            cin >> Job[i].Pi;
        }
        sort(Job, Job + n, cmp);
 
        for (int i = 0; i < m; i++) {  //m为小伙伴数量
            Ai[i].i=i;
            cin >> Ai[i].power;
        }
        sort(Ai, Ai + m, cmp2);
 
        //多思考,
        //人的能力 10  30 45 70
        //工作需要的能力  12 13 14 15 37 59
        // 30人的能力 大于 工作的能力12 13 14 15 所以选其中最大的赋值给30能力的人
        int j=0;
        int maxMoney=0;
        for(int i=0;i<m;i++){
           while(j<n){
               if(Job[j].Di>Ai[i].power){ //工作的能力 大于 人的能力 ,退出
                   break;
               }
               maxMoney=max(maxMoney,Job[j].Pi);
               j++;
           }
           Ai[i].money=maxMoney;
        }
        sort(Ai, Ai + m, cmp3);
        for(int i=0;i<m;i++){
          cout<<Ai[i].money<<endl;
        }
    }
    return 0;
}

答案来自于:https://blog.csdn.net/u011630575/article/details/79874315

点赞