文章目录[x]
- 1:题目内容
- 1.1:题目描述
- 1.2:输入描述:
- 1.3:输出描述:
- 2:示例
- 2.1:输入
- 2.2:输出
- 3:第一次:
- 4:第二次:
- 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
第一次:
#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