第一题:爱丽丝的人偶
题目解析 :假设题目为 "人偶重量排序,找出最轻的前 3 个",核心是对数组排序后取前 3 个元素。思路 :读取人偶重量数组,使用 sort 函数升序排序,然后输出前 3 个元素。代码:
cpp
运行
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> weights(n);
for (int i = 0; i < n; ++i) {
cin >> weights[i];
}
sort(weights.begin(), weights.end());
for (int i = 0; i < 3; ++i) {
cout << weights[i] << " ";
}
return 0;
}
第二题:集合
题目解析 :假设题目为 "求两个集合的交集",即找出同时存在于两个集合中的元素,且结果无重复。思路 :用 unordered_set 存储第一个集合的元素,遍历第二个集合,若元素在第一个集合中且未被记录,则加入结果集。代码:
cpp
运行
cpp
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n), b(m);
unordered_set<int> s;
for (int num : a) {
s.insert(num);
}
unordered_set<int> res_set;
for (int num : b) {
if (s.count(num)) {
res_set.insert(num);
}
}
vector<int> res(res_set.begin(), res_set.end());
for (int num : res) {
cout << num << " ";
}
return 0;
}
第三题:最长回文子序列
题目解析 :最长回文子序列是指字符串中最长的回文序列,子序列可不连续。用动态规划,dp[i][j]表示 s i..j 的最长回文子序列长度。思路 :当 s i == s j 时,dp[i][j] = dp[i+1][j-1] + 2;否则dp[i][j] = max(dp[i+1][j], dp[i][j-1])。从长度为 1 的子串开始递推,最终dp[0][n-1]即为结果。代码:
cpp
运行
cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int i = n-1; i >= 0; --i) {
dp[i][i] = 1;
for (int j = i+1; j < n; ++j) {
if (s[i] == s[j]) {
dp[i][j] = dp[i+1][j-1] + 2;
} else {
dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
}
}
}
cout << dp[0][n-1] << endl;
return 0;
}
谢谢