老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看。 【答案解析】
1.解释:答案选B。 详细解析见下图——
2.解释:答案选D。 详细解析见下图——
3.解释:答案选B。 详细解析见下图——
4.解释:答案选C。 详细解析见下图——
5.解释:答案选D。 详细解析见下图——
6.解释:答案选D。 详细解析见下图——
7.解释:答案选B。 详细解析见下图——
8.解释:答案选C。 详细解析见下图——
9.解释:答案选B。 详细解析见下图——
10.解释:答案选C。 详细解析见下图——
11.解释:答案选D。 详细解析见下图——
12.解释:答案选C。
详细解析见下图——
13.解释:答案选B。
详细解析见下图——
14.解释:答案选D。
判断有向图是否存在环路,BFS和DFS的效率不能一概而论,主要取决于图的结构: ● 如果图是稀疏图,DFS通常更高效,因为它的递归或栈操作在内存占用和缓存命中率上更有优势 ● 如果图是稠密图,BFS的队列操作可能表现更好,尤其是当环路出现在靠近起点的位置时 ● 最坏情况下,两种算法的时间复杂度都是O(V+E),其中V是顶点数,E是边数 🎯 关键结论—— 算法的实际运行速度受图的结构、顶点分布、环路位置等多种因素影响,不存在绝对的"谁更快",因此最准确的说法是不确定,选项D正确。 15.解释:答案选B。 详细解析见下图——【答案解析】
1.解释:正确。 详细解析见下图——2.解释:正确。 详细解析见下图——3.解释:错误。 详细解析见下图——相关知识点的复习与拓展: 4.解释:正确。 详细解析见下图——5.解释:正确。 详细解析见下图——6.解释:错误。 详细解析见下图——7.解释:错误。 ● 哈希冲突的本质哈希函数是将无限域的输入映射到有限域的输出。当输入数量超过输出数量时,必然会出现不同输入对应相同输出的情况,这就是哈希冲突。鸽巢定理证明了这一点:如果有n个鸽巢和m个鸽子,且m > n,则至少有一个鸽巢里有不止一只鸽子。在哈希表中,鸽巢是哈希桶,鸽子是输入的键值对。
● 素数p的作用
选择素数作为p可以减少冲突的概率,但不能完全避免冲突。素数的因数只有1和它本身,这样可以减少因为输入是p的倍数而导致的冲突。例如,如果p是合数,比如4,那么输入为4、8、12等的哈希值都是0,容易导致冲突集中在某个哈希桶中。而如果p是素数,比如5,那么输入为5、10、15等的哈希值都是0,但这样的输入数量相对较少,冲突分散在不同的哈希桶中。
● 具体例子
假设p是素数7,输入x1=3,x2=10,那么H(x1)=3%7=3,H(x2)=10%7=3,此时发生了哈希冲突。
再比如p是素数11,输入x1=5,x2=16,那么H(x1)=5%11=5, H(x2)=16%11=5,也发生了哈希冲突。
结论 无论p选择素数还是合数,哈希冲突都无法完全避免。选择素数作为p只能减少冲突的概率,而不能消除冲突。因此,题目中的说法是错误的。
8.解释:错误。 详细解析见下图——9.解释:正确。 详细解析见下图——10.解释:错误。 详细解析见下图——2023年12月 C++七级 商品交易
#include<iostream>#include<vector>#include<queue>#include<climits>using namespace std;// 定义边的结构体struct Edge {int to; // 目标商品编号long long w; // 交易花费};const long long INF = 4e18; // 设置一个足够大的无穷大值intmain(){// 关闭cin与stdio同步,加速cin输入速度ios::sync_with_stdio(false);// 解绑cin与cout,避免cout刷新拖慢cin读取cin.tie(nullptr);int N, M, a, b;if (!(cin >> N >> M >> a >> b)) return 0;vector<longlong> v(N);for (int i = 0; i < N; ++i) {cin >> v[i];}// 邻接表存图vector<vector<Edge>> adj(N);for (int i = 0; i < M; ++i) {int x, y;cin >> x >> y;// 计算边权: 目标价值 - 当前价值 + 1long long cost = v[y] - v[x] + 1;adj[x].push_back({y, cost});}// dist[i] 表示从起点 a 到商品 i 的最小花费vector<longlong> dist(N, INF);vector<bool> in_queue(N, false); // 标记节点是否在队列中dist[a] = 0;queue<int> q;q.push(a);in_queue[a] = true;// SPFA 算法求最短路while (!q.empty()) {int u = q.front();q.pop();in_queue[u] = false;for (const auto& edge : adj[u]) {int next_node = edge.to;long long weight = edge.w;// 松弛操作if (dist[u] != INF && dist[u] + weight < dist[next_node]) {dist[next_node] = dist[u] + weight;// 如果不在队列中,则加入队列if (!in_queue[next_node]) {q.push(next_node);in_queue[next_node] = true;}}}}// 输出结果if (dist[b] == INF) {cout << "No solution" << endl;} else {cout << dist[b] << endl;}return 0;}代码思路——
2023年12月 C++七级 纸牌游戏
#include<iostream>#include<algorithm>#include<cstring>using namespace std;// long long 防止数值溢出,题目分数累加会很大typedef long long ll;// 用极大负数代表该状态不可到达const ll INF = 1e18;const int MAXN = 1005;/*** dp[i][x][k]* i: 当前游戏进行到第 i 轮* x: 我方本轮打出的牌,取值0、1、2* k: 到当前轮为止,累计换牌 k 次* 值含义:未扣除换牌罚分时,可以获得的最大分数*/ll dp[MAXN][3][MAXN];ll a[MAXN]; // a[i] 第 i 轮基础分值ll b[MAXN]; // b[i] 第 i 次换牌对应的罚分ll pre_b[MAXN]; // pre_b[t]:累计换 t 次牌的总罚分(前缀和)int c[MAXN]; // c[i]:小杨第 i 轮打出的牌int N; // 游戏总轮数/*** @brief 计算第 i 轮我方打出 me 这张牌可以得到多少分数* @param i 轮次* @param me 我方出牌 {0,1,2}* @return 本轮得分(不扣罚分)* 胜负规则:1战胜0,2战胜1,0战胜2;相等平局* 胜利得2*a[i],平局得a[i],失败得0*/ll get_score(int i, int me){int op = c[i]; // op 对手小杨本轮出的牌if (me == op){return a[i]; // 平局}// (me-op+3)%3 ==1 判断我方获胜:处理循环胜负,+3避免负数if ((me - op + 3) % 3 == 1){return 2 * a[i]; // 我方胜利}return 0; // 我方输掉本轮}intmain(){// 读入总轮数cin >> N;// 读入每一轮的基础得分 a1~aNfor (int i = 1; i <= N; i++){cin >> a[i];}// 读入换牌罚分,最多N1次换牌for (int i = 1; i <= N - 1; i++){cin >> b[i];}// 计算罚分前缀和:pre_b[t] 代表换 t 次牌一共要扣多少分pre_b[0] = 0; // 换0次,罚分为0for (int t = 1; t <= N - 1; t++){pre_b[t] = pre_b[t - 1] + b[t];}// 读入小杨每一轮的出牌for (int i = 1; i <= N; i++){cin >> c[i];}// DP数组全部初始化为负无穷,表示初始所有状态不可达for (int i = 0; i <= N; i++){for (int x = 0; x < 3; x++){for (int k = 0; k <= N - 1; k++){dp[i][x][k] = -INF;}}}// ==========初始化第一轮==========// 第一轮没有上一轮,不能发生换牌,换牌次数只能是0for (int x = 0; x < 3; x++){dp[1][x][0] = get_score(1, x);}// =========DP状态转移,从第2轮到第N轮=========for (int i = 2; i <= N; i++) // i代表当前轮{for (int x = 0; x < 3; x++) // x:本轮我方想出的牌{// i轮游戏最多发生 i1次换牌for (int k = 0; k <= i - 1; k++){// 情况1:不换牌,本轮出牌和上一轮相同,换牌次数k保持不变if (dp[i - 1][x][k] != -INF){dp[i][x][k] = max(dp[i][x][k], dp[i - 1][x][k] + get_score(i, x));}// 情况2:发生换牌,本轮x和上一轮y不一样,换牌次数+1if (k >= 1) // 当前累计k次,上一轮是k1次,k不能为0{// y枚举上一轮打出的牌for (int y = 0; y < 3; y++){if (y == x) continue; // 和本轮一样就不是换牌,跳过// 如果上一轮状态可达,进行转移if (dp[i - 1][y][k - 1] != -INF){dp[i][x][k] = max(dp[i][x][k], dp[i - 1][y][k - 1] + get_score(i, x));}}}}}}// =========统计最终答案=========ll ans = -INF;// 遍历所有结束状态:最后一轮出牌0/1/2,总换牌次数t从0~N1for (int x = 0; x < 3; x++){for (int t = 0; t <= N - 1; t++){if (dp[N][x][t] != -INF){// dp存原始得分,减去t次换牌的总罚分pre_b[t]ans = max(ans, dp[N][x][t] - pre_b[t]);}}}cout << ans << endl;return 0;}代码思路——课程体系——
需要无水印PDF格式文件, 或者课程体系咨询, 欢迎扫描下面二维码添加好友垂询。
▍ 声明:本文整理自网络,如有侵权,请联系删除。
本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。 喜欢您关注我们哦——

























































