华为23年5月6日机试(前两题)
=================一些心里话=================
我现在真的很难受,华为机试必须要150分以上才能通过,但是我考试的时候只写出来第一题(83%)
第二题在考试结束10min之后才写出来
这意味着自己与华为无缘了,心里真的很难受,为什么这么笨,为什么考试的时候写不出来,为什么考试的时候不先做分高的题目。
不管怎么说,通过这次考试还是知道了自己与企业要求的差距,看来我现在还是没达到要求。
没关系,过去了就过去了,之后还要继续努力!
===================下面是正文===================
第一题题目是说:
有一个墨盒,用一维数组表示,值为0或者1。
1表示墨盒对应位置是好的,0表示对应位置是坏的。
当我们打印东西的时候,用好的地方打印没有问题,但是用坏的地方打印就会出错。
现在想出来一种补偿算法,即打印两次,第二次打印第一次没打印好的地方。
第二次打印的时候,会将墨盒向左或者向右平移x个单位长度,再重新打印。
要求第二次打印的时候,如果原来是好的地方,不重新打印,只打印错误的地方。
现在求第二次打印的时候,墨盒应该使能的位置(用一个一维数组表示,0表示不使能,1表示使能)
输出格式:
如果向左右平移都能成功,取平移单位最少的两个方案输出。
如果向左或者向右能成功,输出那个平移单位最少的方案。
如果没有方案,输出零。
#include <iostream> #include <cstring> using namespace std; const int N = 1050; int h1[N], h2[N], h3[N]; int n; int main() { scanf("%d", &n); int count = n; int idx = 1; while (count > 0) { char op[7]; scanf(" %s", &op); for (int i = 2; i <= 5; i++) { char o = op[i]; int t = 0; if (o >= '0' && o <= '9') t = o - '0'; else t = o - 'A' + 10; h1[idx++] = (t & 8) >> 3; h1[idx++] = (t & 4) >> 2; h1[idx++] = (t & 2) >> 1; h1[idx++] = t & 1; } count -= 16; } int rf = -1, lf = -1; int fcnt = 0; for (int i = 1; i <= n; i++) if (h1[i] == 0) { if (rf == -1) rf = i; fcnt++; } for (int i = n; i > 0; i--) { if (h1[i] == 0) { lf = i; break; } } if (rf == -1) printf("0"); else { bool flag1 = false; int offset1 = 0; int tempcnt = 0; for (int offset = 1; offset < rf; offset++) { tempcnt = 0; memset(h2, 0, sizeof h2); for (int i = rf; i <= lf; i++) { if (h1[i] == 0 && h1[i - offset] == 1) { h2[i - offset] = 1; tempcnt++; } } if (tempcnt == fcnt) { flag1 = true; offset1 = offset; break; } } bool flag2 = false; int offset2 = 0; tempcnt = 0; for (int offset = 1; offset < lf; offset++) { tempcnt = 0; memset(h3, 0, sizeof h3); for (int i = lf; i >= rf; i--) { if (h1[i] == 0 && h1[i + offset] == 1) { h3[i + offset] = 1; tempcnt++; } } if (tempcnt == fcnt) { flag2 = true; offset2 = offset; break; } } if (flag1 && flag2) { printf("2\n"); printf("+%d\n", offset1); for (int i = 1; i <= n; i++) printf("%d", h2[i]); printf("\n-%d\n", offset2); for (int i = 1; i <= n; i++) printf("%d", h3[i]); } else if (flag1) { printf("1\n"); printf("+%d\n", offset1); for (int i = 1; i <= n; i++) printf("%d", h2[i]); } else if (flag2) { printf("1\n"); printf("-%d\n", offset2); for (int i = 1; i <= n; i++) printf("%d", h3[i]); } else { printf("0"); } } return 0; }
第二题:
讲的是两个“数”相加(有整数部分和小数部分)
“数”由0-9和'!','@','#'组成
题目规定了两个特殊字符相加得到的值,而且保证不会出现数字+特殊字符的情况
求最后的结果?
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 1010; char op[N]; int n; int add(char a, char b) { if (a == '!' && b == '!') return 0; if (a == '!' && b == '@') return 13; if (b == '!' && a == '@') return 13; if (a == '!' && b == '#') return 4; if (b == '!' && a == '#') return 4; if (a == '@' && b == '@') return 7; if (a == '@' && b == '#') return 20; if (b == '@' && a == '#') return 20; if (a == '#' && b == '#') return 5; return 1e9; } int main() { scanf("%d", &n); scanf(" %s", op); vector<char> a1, a2, b1, b2; vector<int> ans1, ans2; bool flag = false; bool flag1 = false; bool flag2 = false; for (int i = 0; i <= n; i++) { if (op[i] == '+') { flag = true; continue; } if (!flag) { if (op[i] == '.') { flag1 = true; continue; } if (!flag1) // 整数 a1.push_back(op[i]); else a2.push_back(op[i]); } else { if (op[i] == '.') { flag2 = true; continue; } if (!flag2) // 整数 b1.push_back(op[i]); else b2.push_back(op[i]); } } int s = max(a1.size(), b1.size()); while (a1.size() != s) a1.push_back('0'); while (b1.size() != s) b1.push_back('0'); reverse(a1.begin(), a1.end()); reverse(b1.begin(), b1.end()); int t = 0; for (int i = 0; i < s; i++) { if (a1[i] >= '0' && b1[i] <= '9') { t += (a1[i] - '0'); t += (b1[i] - '0'); } else t += add(a1[i], b1[i]); ans1.push_back(t % 10); t /= 10; } while (t) { ans1.push_back(t % 10); t /= 10; } reverse(ans1.begin(), ans1.end()); s = max(a2.size(), b2.size()); while (a2.size() != s) a2.push_back('0'); while (b2.size() != s) b2.push_back('0'); reverse(a2.begin(), a2.end()); reverse(b2.begin(), b2.end()); t = 0; for (int i = 0; i < s; i++) { if (a2[i] >= '0' && b2[i] <= '9') { t += (a2[i] - '0'); t += (b2[i] - '0'); } else t += add(a2[i], b2[i]); ans2.push_back(t % 10); t /= 10; } reverse(ans2.begin(), ans2.end()); if (t) { reverse(ans1.begin(), ans1.end()); for (int i = 0; i < ans1.size(); i++) { t += ans1[i]; ans1[i] = t % 10; t /= 10; } while (t) { ans1.push_back(t % 10); t /= 10; } reverse(ans1.begin(), ans1.end()); } for (int i = 0; i < ans1.size(); i++) printf("%d", ans1[i]); printf("."); for (int i = 0; i < ans2.size(); i++) printf("%d", ans2[i]); return 0; }