题目描述:
小明有n个朋友,每个朋友有一定数量的钱去买房子,每个房子有舒适度和价格。
要求:1、一个人最多买一个房子。2、每个房子只能被一个人买。3、钱数必须大于房子价格。
问:如何买房子,使得舒适度之和最大。
输入要求:
第一行输入朋友个数与房子个数
第二行依次输入每个人有多少钱,输入n次
第三行依次输入每个房子对应的舒适度与价钱
输出要求:输出舒适度的最大值
示例:
输入:
5 6
5 3 2 10 7
9 8
9 3
7 6
4 7
1 7
8 1
输出:
33
分析:
我们要从舒适度最高的房子开始买,每次买房子都让价钱第一个大于房子的价格的人买,这样的话我们留下了钱更多的人,钱越多的人到后面选择就更多。
因为们要用每个人的钱去与房子的价格比较,所以我们在用map容器放人与人所拥有的钱的时候,我们把钱放到值域,这样我们就可以用lower_bound(price)函数来寻找第一个拥有的钱大于price的人
代码:
void Bublesort(vector<vector<int>> & arr)
{
for(int i=0;i < arr.size()-1;i++)
{
for(int j = 0;j <arr.size()-1-i;j++)
{
if(arr[j][0] < arr[j+1][0])
{
vector<int> tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int oneq()
{
int n;
int m;
cin>>n>>m;
map<int,int> money;
int k = n;
while(k--)
{
int mon;
cin>>mon;
money[mon]++;
}
vector<vector<int>> vec(m,vector<int>(2,0));
for(int i=0;i<m;i++)
{
cin>>vec[i][0];///0是舒适度
cin>>vec[i][1];///1是价格
}
Bublesort(vec); //根据舒适度排一个降序
int res = 0;
for(int i = 0;i<m;i++)
{
int price = vec[i][1];
int shushi = vec[i][0];
auto it = money.lower_bound(price); //找金钱第一个大于price的人
if(it != money.end())
{
it->second--;
if(it->second == 0 )
money.erase(it);
res += shushi;
}
if(money.empty()) break;
}
return res;
}
int main()
{
cout<<oneq()<<endl;;
return 0;
}
注意事项:
在给舒适度排序的时候,我们可以运用到泛型算法中的sort函数,sort(house.begin(), house.end(), [](const vector& a, const vector& b){
return a[0] > b[0];}),第三个参数是传的比较的方式。
我们要使用合适的容器来存储我们的数据,我们还要多了解一些常用的泛型算法,lower_bount(x),upper_bound(x)函数是map容器中寻找值域第一个大于或第一个小于x的键值对,并返回这个键值对的位置