C/C++每日一练21

发布时间:2026/8/8 21:53:28
C/C++每日一练21 第一题爱丽丝的人偶题目解析假设题目为 “人偶重量排序找出最轻的前 3 个”核心是对数组排序后取前 3 个元素。思路读取人偶重量数组使用 sort 函数升序排序然后输出前 3 个元素。代码cpp运行#include iostream #include vector #include algorithm using namespace std; int main() { int n; cin n; vectorint 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运行#include iostream #include vector #include unordered_set using namespace std; int main() { int n, m; cin n m; vectorint a(n), b(m); unordered_setint s; for (int num : a) { s.insert(num); } unordered_setint res_set; for (int num : b) { if (s.count(num)) { res_set.insert(num); } } vectorint 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[i1][j-1] 2否则dp[i][j] max(dp[i1][j], dp[i][j-1])。从长度为 1 的子串开始递推最终dp[0][n-1]即为结果。代码cpp运行#include iostream #include vector #include string using namespace std; int main() { string s; cin s; int n s.size(); vectorvectorint dp(n, vectorint(n, 0)); for (int i n-1; i 0; --i) { dp[i][i] 1; for (int j i1; j n; j) { if (s[i] s[j]) { dp[i][j] dp[i1][j-1] 2; } else { dp[i][j] max(dp[i1][j], dp[i][j-1]); } } } cout dp[0][n-1] endl; return 0; }谢谢