华为笔试 - 2020.8.5

第一题:83%
第二题:100%
第三题:50%

第一题:

第一行输入一个字符串,第二行输入五个字符串。
每个字母对应一个幸运值a:1,z:26,A:1,Z:26,
每个字符串的幸运值等于各个字母的幸运值相加。
从五个字符串中找出与第一行字符串幸运值最接近的字符串输出。若幸运值相同则匹配最后一个。

输入:
bbb
aaa ccc bba abb ddd
输出:
abb
#include <iostream>
#include <string>
using namespace std;
int value(string &s);
int main() {
	string s, in,best;
	int differ=10000,sv,iv;
	cin >> s;//嘉宾
	sv = value(s);
	for (int i = 0;i < 5;i++) {
		cin >> in;
		iv = value(in);
		int d = (iv - sv > 0) ? (iv - sv) : (sv - iv);
		if (d <= differ ) {
			differ = d;
			best = in;
		}
	}
	cout << best;
    return 0;
}
int value(string &s) {
	int ret = 0;
	for (int i = 0;i < s.size();i++) {
		if (s[i] >= 'a'&&s[i] <= 'z') {
			ret += s[i] - 'a'+1;
		}
		else if (s[i] >= 'A'&&s[i] <= 'Z'){
			ret += s[i] - 'A'+1;
		}
	}
	return ret;
}

第二题:

第一行输入一个字符串T,
第二行输入一个字符串A, H*R这样的构造,H、R长度至少为1,对字符串T进行匹配,*可以匹配任意长度字符串,要求T中匹配H和R的部分不能重复使用。
输出有几种匹配。

输入:
AAAXBBB
A*B
输出:
3
注:有三种匹配方式:AAAXB、AAXBB、AXBBB。
而AAAXB和AAAXBB就不行,因为第一个A匹配H用了两次。

#include <iostream>
#include <string>
using namespace std;
int find(string &T, int h, string &A, int begin, int end);
int main() {
	string T, A;
	cin >> T >> A;
	int loc = 0;
	for (;loc < A.size();loc++) {
		if (A[loc] == '*') {
			break;
		}
	}
	int count = 0;
	int s1 = 0, s2 = 0;
	while (true) {
		int h1 = find(T, s1, A, 0, loc - 1);
		if (h1 == -1)break;
		int h2 = find(T, s2, A, loc + 1, A.size() - 1);
		if (h2 == -1)break;
		while (h1 >= h2) {
			h2 = find(T, h2+1, A, loc + 1, A.size() - 1);
			if (h2 == -1)break;
		}
		if (h2 == -1)break;
		if (h1 < h2) {
			count++;
			s1 = h1 + 1;
			s2 = h2 + 1;
		}
	}
	cout << count;
	return 0;
}
int find(string &T, int h, string &A, int begin,int end) {
	while (h < T.size()) {
		int i = begin;
		for (;i <= end;i++) {
			if (T[h + i - begin] == A[i]) {
				continue;
			}
			else {
				h++;
				break;
			}
		}
		if (i > end) {
			return h;
		}
	}
	return -1;
}

第三题:

0-1背包问题,只不过每一种物品有多个,用存活时间除以技能冷却时间就是这个物品的数量,把每种物品,按个展开存放就是0-1背包问题。
笔试时一直编译不了,出错Stack overflow,我就直接提交了,过了50%。现在也不知道对不对

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class goods {
public:
	int value;
	int cost;
};

int V[20000][1000];//局部变量太大,放在函数里面会出现异常:Stack overflow
int main() {
	int num, money, livetime;
	vector<goods> goo;
	cin >> num >> money >> livetime;
	for (int i = 0, v, c, t;i < num;i++) {
		cin >> v >> c >> t;
		for (int j = 0;j < livetime / t;j++) {
			goods g;
			g.value = v;
			g.cost = c;
			goo.push_back(g);
		}
	}

	for (int i = 0;i < goo.size();i++) {
		V[i][0] = 0;
	}
	for (int j = 0;j < money;j++) {
		V[0][j] = 0;
	}
	for (int i = 1;i <= goo.size();i++) {
		for (int j = 1;j <= money;j++) {
			if (goo[i - 1].cost > j) {
				V[i][j] = V[i - 1][j];
			}
			else {
				V[i][j] = max(V[i - 1][j], V[i - 1][j - goo[i - 1].cost] + goo[i - 1].value);
			}
		}
	}
	cout << V[goo.size()][money] << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/MAN_Sue/article/details/107825569
今日推荐