第一题: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;
}