1.牛牛找工作
问题描述:n种工作 每个工作有一个难度指数d,和一个报酬p
m个人,每个人有一个能力指数a。
帮助这m个人找到报酬最大的工作。
思考:采用合适的数据结构来存储和处理题目给的数据,于是采用stl中的map,因为map在处理这种一一对应的两个值时有优势,如果想要使用vector那就必须自己定义一个结构体。
思路:用map将这些d和p存储起来之后,我们要对数据进行处理这样才能对任意一个能力a快速的找到所对应的最大薪酬,处理方式是将 任意一个难度指数 对应的存储 最大的薪酬。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin >> n >> m;
if( n < 0 || n >100000 || m < 0 || m > 100000)
return 0;
map<int,int> aMap;
for(int i = 0; i < n; i++)
{
int d,p;
cin >> d >> p;
aMap[d] = aMap[d] == 0 ? p : max(aMap[d],p);
}
int temp = 0;
auto iter = aMap.begin();
for(;iter != aMap.end();iter++)
{
temp = max(temp,iter->second);
iter->second = temp;
}
for(int i = 0; i < m; i++)
{
int res = 0;
int a;
cin >> a;
iter = aMap.upper_bound(a);
iter--;
res = iter->second;
cout << res << endl;
}
}
其中第一个循环将数据读入map,第二个循环将对数据进行处理,第三个循环对每个人进行寻找。upper_bound函数是采用二分查找的方式查找第一个大于参数的位置 返回当前位置的 迭代器。
其实本题我不怎么想用map,因为在第一个循环中我用了一个三元操作符,它的功能是如果难度指数相同的情况只保留薪酬大的数值,我对map操作不熟练,我觉得既然出现key值相同的情况我就不想用map咯,不然还要搞事情。
所以我用大家最喜欢的vector再写了一遍。
思路相同代码如下:
#include<bits/stdc++.h>
using namespace std;
struct offer
{
int d,p;
bool operator < (const offer o) const
{
return d < o.d;
}
};
int main()
{
int n,m;
cin >> n >> m;
if( n < 0 || n >100000 || m < 0 || m > 100000)
return 0;
vector<offer> arry;
for(int i = 0; i < n; i++)
{
offer o;
int d,p;
cin >> o.d >> o.p;
arry.push_back(o);
}
sort(arry.begin(),arry.end());
int temp = 0;
auto iter = arry.begin();
for(;iter != arry.end();iter++)
{
temp = max(temp,(*iter).p);
(*iter).p = temp;
}
for(int i = 0; i < m; i++)
{
int res = 0;
offer oo;
cin >> oo.d;
iter = upper_bound(arry.begin(),arry.end(),oo);
iter--;
res = (*iter).p;
cout << res << endl;
}
}
这里定义了一个结构体offer(希望能找到工作QAQ)然后重载了 < 这样后面的sort函数 upper_bound函数 才能正常使用。
所有代码都经过测试,请放心食用。