GESP:2023年12月 C++七级 真题及解析

四季读书网 10 0
GESP:2023年12月 C++七级 真题及解析
老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看
GESP:2023年12月 C++七级 真题及解析-第1张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第2张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第3张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第4张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第5张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第6张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第7张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第8张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第9张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第10张图片-四季读书网

【答案解析】

1.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第11张图片-四季读书网
2.解释:答案选D。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第12张图片-四季读书网
3.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第13张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第14张图片-四季读书网
4.解释:答案选C。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第15张图片-四季读书网
5.解释:答案选D。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第16张图片-四季读书网
6.解释:答案选D。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第17张图片-四季读书网
7.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第18张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第19张图片-四季读书网
8.解释:答案选C。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第20张图片-四季读书网
9.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第21张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第22张图片-四季读书网
10.解释:答案选C。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第23张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第24张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第25张图片-四季读书网
11.解释:答案选D。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第26张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第27张图片-四季读书网

12.解释:答案选C。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第28张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第29张图片-四季读书网

13.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++七级 真题及解析-第30张图片-四季读书网

14.解释:答案选D。

判断有向图是否存在环路,BFS和DFS的效率不能一概而论,主要取决于图的结构:
● 如果图是稀疏图,DFS通常更高效,因为它的递归或栈操作在内存占用和缓存命中率上更有优势
● 如果图是稠密图,BFS的队列操作可能表现更好,尤其是当环路出现在靠近起点的位置时
● 最坏情况下,两种算法的时间复杂度都是O(V+E),其中V是顶点数,E是边数
🎯 关键结论——
算法的实际运行速度受图的结构、顶点分布、环路位置等多种因素影响,不存在绝对的"谁更快",因此最准确的说法是不确定,选项D正确
15.解释:答案选B。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第31张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第32张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第33张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第34张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第35张图片-四季读书网

【答案解析】

1.解释:正确。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第36张图片-四季读书网
2.解释:正确。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第37张图片-四季读书网
3.解释:错误。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第38张图片-四季读书网
相关知识点的复习与拓展:
GESP:2023年12月 C++七级 真题及解析-第39张图片-四季读书网
4.解释:正确。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第40张图片-四季读书网
5.解释:正确。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第41张图片-四季读书网
6.解释:错误。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第42张图片-四季读书网
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.解释:错误。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第43张图片-四季读书网
9.解释:正确。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第44张图片-四季读书网
10.解释:错误。
详细解析见下图——
GESP:2023年12月 C++七级 真题及解析-第45张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第46张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第47张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第48张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第49张图片-四季读书网

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<longlongv(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;        // 计算边权: 目标价值 - 当前价值 + 1        long long cost = v[y] - v[x] + 1;        adj[x].push_back({y, cost});    }    // dist[i] 表示从起点 a 到商品 i 的最小花费    vector<longlongdist(N, INF);    vector<boolin_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;}
代码思路——
GESP:2023年12月 C++七级 真题及解析-第50张图片-四季读书网

GESP:2023年12月 C++七级 真题及解析-第51张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第52张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第53张图片-四季读书网

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~aN    for (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次,罚分为0    for (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;            }        }    }    // ==========初始化第一轮==========    // 第一轮没有上一轮,不能发生换牌,换牌次数只能是0    for (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不一样,换牌次数+1                if (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~N1    for (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;}
代码思路——
GESP:2023年12月 C++七级 真题及解析-第54张图片-四季读书网
GESP:2023年12月 C++七级 真题及解析-第55张图片-四季读书网

课程体系——

GESP:2023年12月 C++七级 真题及解析-第56张图片-四季读书网
需要无水印PDF格式文件,
或者课程体系咨询,
欢迎扫描下面二维码添加好友垂询。
GESP:2023年12月 C++七级 真题及解析-第57张图片-四季读书网

GESP:2023年12月 C++七级 真题及解析-第58张图片-四季读书网

▍ 声明:本文整理自网络,如有侵权,请联系删除。

本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。

喜欢您关注我们哦——

抱歉,评论功能暂时关闭!