第一题:关于字符串处理(如果是'a'-'z'向后移动一个('z'变为'a'),如果是'A'-'Z'向前移动一个('A'变为'Z'))
比较简单,而且代码我忘记保存了
第二题:N个字符串,每个字符串有一个权重,求两个字符串的最大权重之和,要求这两个字符串是一个是另一个的子串。
考的手撕KMP
#include <iostream> using namespace std; const int N = 15; const int M = 110; string strs[M]; int values[M]; int m; bool KMP_Func(string s, string p) { // 判断p是否为s的子串 int n = s.size(); int m = p.size(); if (n < m) return false; else if (n == m) return s == p; else { int ne[N] = {}; ne[0] = -1; for (int i = 1, j = -1; i < m; i++) { while (j != -1 && p[i] != p[j + 1]) j = ne[j]; if (p[j + 1] == p[i]) ne[i] = ++j; else ne[i] = -1; } for (int i = 0, j = -1; i < n; i++) { while (j != -1 && s[i] != p[j + 1]) j = ne[j]; if (s[i] == p[j + 1]) { j++; if (j == m - 1) return true; } } return false; } } int main() { scanf("%d", &m); for (int i = 0; i < m; i++) cin >> strs[i] >> values[i]; int ans = 0; for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) if (i != j && KMP_Func(strs[i], strs[j])) ans = max(ans, values[i] + values[j]); if (ans) printf("%d", ans); else printf("-1"); return 0; }
第三题:没写....
// 仅由0 1 2组成的字符串,其中一些字符被替换成了? // 满足以下性质: // 1. 相邻字符串不相等 // 2. 所有字符串长度为3的连续子串。三进制数为偶数
第四题:
1号城市到n号城市,城市之间有道路连接,每条道路有距离、最大承重
求总路程不超过h的前提下,1到n的最大承重为多少?
第一行三个正整数n, m, h城市数量、道路数量、路程限制
接下来m行 u, v, w, d 表示uv两个城市之间有一条长d限重w的道路
3 3 5 1 2 7 3 1 3 6 4 3 2 4 2 结果为6
考试的时候没写出来,之后自己回去写了个暴力做法,能过样例,但我估计不能全通过
#include <iostream> #include <cstring> using namespace std; const int N = 110; int al[N], e[N], ne[N], weight[N], dist[N], idx; bool visit[N]; int n, m, h; int cur_distance; int ans; void add(int u, int v, int w, int d) { e[idx] = v; ne[idx] = al[u]; weight[idx] = w; dist[idx] = d; al[u] = idx++; } void dfs(int x) { if (cur_distance > h) return; if (x == n) { int t = 1e9; for (int i = 1; i <= n; i++) if (visit[i]) t = min(t, weight[i]); ans = max(ans, t); return; } for (int i = al[x]; i != -1; i = ne[i]) { int p = e[i]; if (!visit[p]) { visit[p] = true; cur_distance += dist[p]; dfs(p); cur_distance -= dist[p]; visit[p] = false; } } } int main() { memset(al, -1, sizeof al); scanf("%d%d%d", &n, &m, &h); for (int i = 0; i < m; i++) { int u, v, w, d; scanf("%d%d%d%d", &u, &v, &w, &d); add(u, v, w, d); add(v, u, w, d); } dfs(1); printf("%d", ans); return 0; }