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++ 六级编程题的全部内容了,非常感谢您看到这里,三连关煮,我们下期再见!