题目介绍
选题来自:网易
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
我的思路
贪心算法: 按工作报酬大小从大到小排序;当报酬一定时,按照工作能力从小到大排序;
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
bool cmp(const pair<int,int> &p1,const pair<int,int> &p2)
{
if(p1.second!=p2.second)
return p1.second>p2.second;
else
return p1.first<p2.first;
}
int main(){
int n=0, m=0;
//cout<<"please enter n and m"<<endl;
cin>>n;
cin>>m;
vector<pair<int, int>>works;
//cout<<"please enter works"<<endl;
for(int i=0; i<n; i++)
{
pair<int, int>tmp;
cin>>tmp.first;
cin>>tmp.second;
works.push_back(tmp);
}
vector<int>A(m, 0);
vector<int>Money(m, 0);
//cout<<"please enter Ai"<<endl;
for(int i=0; i<m; i++)
{
cin>>A[i];
}
sort(works.begin(), works.end(), cmp);
for(int i=0; i<m; i++)
{
for(auto iter: works)
{
if(iter.first<=A[i])
{
Money[i]=iter.second;break;
}
}
}
for(int i=0; i<m; i++)
{
cout<<Money[i]<<endl;
}
return 0;
}
测试结果:
不通过
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为80.00%
解决方法
同时将works和ai排序;
- 工作按照工作难度排序;
- 工人按照工作能力从小到大排序
- 当第i个人选择完工作后,第i+1个人从第i个人选择的工作开始选择(要么选择当前工作要么选择接下来的工作)
- 总的复杂度就是max{O(nlogn), O(mlogm), O(m+n)} < O(mn)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmpWorks(const pair<int,int> &p1,const pair<int,int> &p2)
{
return p1.first<p2.first;
}
bool cmpAi(const pair<int,int> &p1,const pair<int,int> &p2)
{
return p1.second<p2.second;
}
int main(){
int n=0, m=0;
//cout<<"please enter n and m"<<endl;
cin>>n;
cin>>m;
vector<pair<int, int>>works;
//cout<<"please enter works"<<endl;
works.push_back(make_pair(0, 0));
for(int i=0; i<n; i++)
{
pair<int, int>tmp;
cin>>tmp.first;
cin>>tmp.second;
works.push_back(tmp);
}
vector<pair<int, int>>A;
vector<int>Money(m, 0);
//cout<<"please enter Ai"<<endl;
for(int i=0; i<m; i++)
{
pair<int, int>tmp;
tmp.first=i;
cin>>tmp.second;
A.push_back(tmp);
}
sort(works.begin(), works.end(), cmpWorks);
sort(A.begin(), A.end(), cmpAi);
for(int i=1; i<=n; i++)
{
works[i].second = max(works[i-1].second, works[i].second);
}
int j=1, maxValue=0;
for(int i=0; i<m; i++)
{
while(j<=n && works[j].first <= A[i].second)
{
maxValue = works[j].second;
j++;
}
Money[A[i].first] = maxValue;
}
for(int i=0; i<m; i++)
{
cout<<Money[i]<<endl;
}
return 0;
}