阿里8-3笔试题

题目描述:

小明有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的键值对,并返回这个键值对的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值