GESP 2026年6月 C++ 六级 编程题

Hello!大家好,我是Zac!今天刚考完六级,感觉这一次放水了,我们简单看一下两道编程题,让后我再讲讲我的思路。

第一题

这道题题目大概意思就是:

有一个长度为 n 的蛋糕,有 n 种分法,一块长度为 i 的蛋糕可以卖 pi 元,将这块吗蛋糕切成若干块整数长度的蛋糕,求他们的最大利润。

思路

拿到这道题,我们不难看出,这是一道非常典型的完全背包问题,n 就是背包容量,i 是大小,pi 就是利润。知道了这些,我们只需套模板即可,注意:1 <= n <= 1000, 1 <= pi <= ?(忘了,开long long吧)。

AC Code:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n, p[1010];
long long dp[1010];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            dp[j] = max(dp[j], dp[j - i] + p[i]);
        }
    }
    cout << dp[n] << endl;
    return 0;
}

第二题

这道题题目大概意思就是:

给定一个n,表示一个二叉树中有n(1 <= n <= 10^5) 个节点,输入n行,每行两个数,表示节点i的左儿子和右儿子,如果为0则表示这个字节点为空。求这个树的满二叉树子树的数量。

思路

我们首先要明确一个定义:子树的定义

有以下两个定义:

定义一:子树 = 以某个节点为根的子树(包含该节点及其所有后代)。

定义二:子树 = 树中任意一个连通子图(不一定要包含所有后代)。

在绝大多数的算法竞赛题目中:子树的定义多采取定义一

所以,我们举个例子,考虑以下二叉树:

cpp 复制代码
    1
   / \
  2   3
 / \ / \
 4 5 6 7

按照定义一,我们有这样的7个子树:

(1,2,3,4,5,6,7)、(2,4,5)、(3,6,7)、4、5、6、7.

所以我们只需要一次遍历每个节点,如果左儿子和右儿子都不为空/都为空,那么cnt++,否则继续。

AC Code:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n;
int lson[MAXN], rson[MAXN];
int ans = 0;
bool dfs(int u) {
    if (u == 0) return true;
    bool l = dfs(lson[u]);
    bool r = dfs(rson[u]);
    if (lson[u] == 0 && rson[u] == 0) {
        ans++;
        return true;
    }
    if (lson[u] != 0 && rson[u] != 0 && l && r) {
        ans++;
        return true;
    }
    return false;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> lson[i] >> rson[i];
    }
    dfs(1);
    cout << ans << endl;
    return 0;
}

那么以上就是2026年6月 GESP C++ 六级编程题的全部内容了,非常感谢您看到这里,三连关煮,我们下期再见!