阿里开发岗笔试——8.3

参考:阿里算法工程师笔试

第一题:0% 一直出错,考完才知道要用long long int
第二题:0% 没时间看

第一题:小明有n个朋友,每个朋友有一定数量的钱去买房子,每个房子有舒适度和价格。
要求:1、一个人最多买一个房子。2、每个房子只能被一个人买。3、钱数必须大于房子价格。
问:如何买房子,使得舒适度之和最大。

用long long int

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class house {
public:
	int soft;
	int price;
	house(int a, int b) {
		this->soft = a;
		this->price = b;
	}
};
bool cmp(house &a, house &b) {
	return a.soft > b.soft || a.soft == b.soft&&a.price < b.price;
}
int main() {
	int n, m;
	vector<house> h;
	vector<int> money;
	cin >> n>>m;//朋友数,房子数
	for (int i = 0,in;i < n;i++) {
		cin >> in;
		money.push_back(in);
	}
	for (int i = 0,a,b;i < m;i++) {
		cin >> a >> b;
		house in(a, b);
		h.push_back(in);
	}
	vector<int> take(n,0);//记录哪个朋友把钱花出去了
	/*重中之重,要用long long*/
	long long int bestSoft = 0;
	sort(money.begin(), money.end(), less<int>());//升序
	sort(h.begin(), h.end(), cmp);//降序
	for (int i = 0,j;i < m;i++) {
		//从舒适度高到低检索房子,舒适度相同先检索便宜的
		for (j = 0;j < n;j++) {
			//从贫穷到富裕检索朋友
			//能买得起就直接买
			if (take[j] == 1) {
				continue;
			}
			if (money[j] >= h[i].price) {
				break;
			}
			
		}
		//穷人先买,买当前价位最舒服的
		if (j < n && money[j] >= h[i].price) {
			take[j] = 1;
			bestSoft += h[i].soft;
		}
	}
	cout << bestSoft;
	return 0;

	
}

第二题:给定字符串N,只包含abcdef,求子序列最大长度,子序列可以不连续。
要求:1、a必须在c、e前面,c必须在e前面。
2、b必须在d、f前面,d必须在f前面。

猜你喜欢

转载自blog.csdn.net/MAN_Sue/article/details/107773047