参考:阿里算法工程师笔试
第一题: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前面。