声 明
1、2021年复旦大学机试不采用OJ判定,无具体数据范围与测试数据以及输入输出规范。
2、2021年复旦大学机试设定测试时间为150分钟,要求提交源代码+解题思路+自测数据。
3、本人所提供的题解不一定为最佳题解或唯一解法,仅供参考。输入规范、输出规范、测试用例可由考生自己设定。若有谬误,欢迎指正。
4、本次机试题,在Leetcoder上均有原题。

第 1 题

方法:深度优先搜索(DFS)

思路:由测试数据可知此题为完全二叉树,不必建树。从根节点开始向下遍历,期间维护从根节点到当前节点 xxx 的最大值 premax[x]premax[x]premax[x],若当前节点的值大于等于 premax[x]premax[x]premax[x],标记当前节点为关键节点,即 vis[x]vis[x]vis[x] 标记为 111。从当前节点继续向下递归左孩子 2x2x2x 与 右孩子 2x+12x+12x+1,遇到值为 −1-1−1 时 returnreturnreturn。时间复杂度为 O(N)O(N)O(N),空间复杂度为 O(N)O(N)O(N), NNN 为节点总数。

输入规范:给出完全二叉树节点个数 N, 接下来按照层序遍历(BFS)顺序给出每个节点的值,其中 −1-1−1 表示空节点。

输出规范:输出关键节点个数

测试用例
输入:7 3 1 4 3 -1 1 5
输出:4
状态:通过

输入:15 8 5 6 10 15 2 7 11 11 11 11 11 11 11 11
输出:9
状态:通过

#include<iostream>
using namespace std;const int maxn = 1e5;int n;//节点个数
int a[maxn];//二叉树元素
int vis[maxn];//标记是否为关键节点
int premax[maxn];//记录到当前节点路径上的最大值void work(int x) {// DFS实现,x为当前节点ID,premax表示为从根节点到当前节点的最大值if (a[x] == -1) return;if (a[x] >= premax[x/2]) {premax[x] = a[x]; vis[x] = 1;}else {premax[x] = premax[x / 2];}work(2 * x);work(2 * x + 1);
}int main() {cin >> n;memset(a, -1, sizeof a);//初始每一个节点都为NULLfor (int i = 1; i <= n; i++) {cin >> a[i];//用-1表示NULL}memset(vis, 0, sizeof vis);work(1);int Ans = 0;for (int i = 1; i <= n; i++) {if (vis[i]) Ans++;}cout << Ans << endl;//关键节点个数return 0;
}

第 2 题

方法:动态规划

思路:答案为斐波那契数列,当前台阶,可以由下一层台阶跳一级而来,也可以由下两层台阶跳二级而来,由此可得状态转移方程为 dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i-1] + dp[i-2]dp[i]=dp[i−1]+dp[i−2];初始化 dp[1]dp[1]dp[1] 为 111,dp[2]dp[2]dp[2] 为 222。可逐步递推得到 dp[n]dp[n]dp[n]。时间复杂度为 O(N)O(N)O(N), 空间复杂度为 O(N)O(N)O(N), NNN 为台阶总数。

输入规范:输入总体台阶数 NNN。

输出规范:输出总方案数。

测试用例
输入:3
输出:3
状态:通过

输入:10
输出:89
状态:通过

测试用例:
输入:14
输出:610
状态:通过

测试用例:
输入:30
输出:1346269
状态:通过

#include<iostream>
using namespace std;#define LL long long int
#define ll LLconst int maxn = 1e5;
LL dp[maxn];int main() {int n;cin >> n;dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}cout << dp[n] << endl;return 0;
}

第 3 题

方法 1:动态规划+滚动数组优化(适用于数据量较大,但数据值不高的数据)

思路:可以将本问题转化为背包问题。期望 E=正数和−负数和的绝对值E=正数和-负数和的绝对值E=正数和−负数和的绝对值,数据总和 sum=正数和+负数和的绝对值sum=正数和+负数和的绝对值sum=正数和+负数和的绝对值。联立方程组可得:正数和Tot=(E+sum)/2正数和 Tot=(E + sum)/ 2正数和Tot=(E+sum)/2 ;则原问题转换为,在序列中选择几个数,满足和为 TotTotTot,为经典背包问题。注意,E+sumE + sumE+sum 必须为偶数,否则无解。
dp[j]dp[j]dp[j]表示为装满容量为j的背包共有多少方案,则遍历到元素a[i]的时候,状态转移方程(由于当前状态只与上一层状态有关,所以可采用一维数组优化)为 dp[j]=dp[j]+dp[j−a[i]]dp[j] = dp[j] + dp[j - a[i]]dp[j]=dp[j]+dp[j−a[i]] ;当前容量为j的方案为原来容量为j的方案数+可以通过添加a[i]转移过来的方案数。最终输出 dp[Tot]dp[Tot]dp[Tot],Tot为转换为背包问题后的期望值。时间复杂度为 O(N∗Tot)O(N*Tot)O(N∗Tot),空间复杂度为 O(N+Tot)O(N+Tot)O(N+Tot),NNN 为序列长度,TotTotTot 为正数和。

方法 2:暴力枚举(适用于数据量较小,但数据值较高的数据)

思路:通过深度优先搜索,每一个数都只有取正取负两种可能。时间复杂度为O(2^N),空间复杂度为O(N)。

输入规范:给出序列长度N,输入N个非负整数,输入期望值E。结果对1e9+7取模(防止方案数太多超过数据范围)。

输出规范:输出总方案数。

测试用例
输入:5 1 1 1 1 1 3
输出:5
状态:通过

输入:10 1 2 3 4 5 6 7 8 9 10 15
输出:31
状态:通过

输入:10 1 1 1 1 1 1 1 1 1 1 5
输出:0
状态:通过

输入:10 1 1 1 1 1 1 1 1 1 1 4
输出:120
状态:通过

输入:50 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 25
输出:0
状态:通过

输入:50 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 26
输出:399650253
状态:通过

  • 动态规划+滚动数组
#include<iostream>
#include<cstdio>
using namespace std;#define LL long long int
#define ll LLconst int maxn = 1e5;
const int mod = 1e9 + 7;LL a[maxn];
int n;//序列长度
LL Ans;//总方案数
LL E;//期望数void work() {int sum = 0;for (int i = 1; i <= n; i++) {sum += a[i];}LL Tot = (E + sum) / 2;// 正数和if ((E + sum) % 2 != 0) { // 无解puts("0"); return;}LL *dp = new LL[Tot + 1](); // 申请dp并初始化dp[]为0dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = Tot; j >= a[i]; j--) {dp[j] = dp[j] + dp[j - a[i]];dp[j] %= mod;//取模}}cout << dp[Tot] << endl;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}cin >> E;work();return 0;
}
  • 暴力枚举
#include<iostream>using namespace std;#define LL long long int
#define ll LLconst int maxn = 1e5;
const int mod = 1e9 + 7;LL a[maxn];
LL n;//序列长度
LL Ans;//总方案数
LL E;//期望数void dfs(LL x, LL sum) {if (x == n) {//递归到最后一个元素,准备返回if(sum == E) Ans++; return;}dfs(x + 1, sum + a[x + 1]);dfs(x + 1, sum - a[x + 1]);
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}cin >> E;dfs(0, 0);cout << Ans << endl;return 0;
}

2021年复旦大学计算机科学与技术/电子信息/软件工程机试题解相关推荐

  1. 2021年苏州大学计算机科学与技术学院考研信息

    大学简介 苏州大学(Soochow University),坐落于历史文化名城苏州,是教育部与江苏省人民政府共建的国家"世界一流学科建设高校",国家"211工程" ...

  2. 2021年计算机科学与技术排名,2021年全国计算机科学与技术专业大学排名

    摘要: 2021年全国计算机科学与技术专业大学排名为你介绍对于计算机专业的学生来说,对自己学校的计算机专业水平在全国处在什么位置是十分关心的,小编为此查找计算机专业大学排名的相关资料,以供大家阅读参考 ...

  3. 2021计算机科学调剂,2021北京科技大学计算机科学与技术专业接收调剂研究生的通知...

    2021北京科技大学计算机科学与技术081200    招生信息 学校名称:北京科技大学 学校省份:北京 学校层次:211;一流学科; 学院名称: 专业名称:计算机科学与技术 专业代码:081200 ...

  4. 计算机科学归类为电子信息,电子信息类专业分类和区分

    电子信息类专业分类和区分 目前专业名称和分类没有统一的标准,没有明确的界限划分. 电气信息类和电子信息类专业火成什么熊样不用我说了吧,但是你真的了解这类专业吗?好,来看看这些专业名字像不像绕口令?这下 ...

  5. 复旦大学计算机科学与技术分数,2015年复旦大学计算机科学与技术考研复试分数线是320分...

    2015年复旦大学计算机科学与技术考研复试分数线是320分 2015年复旦大学计算机科学与技术考研复试分数线是320分,政治50英语50专业课一90专业课二90. (一)参加全国统考及联考的考生 (二 ...

  6. 【调剂】中国人民大学信息学院2021年专业硕士研究生(电子信息专业 非全日制) 接收调剂的通知...

    点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 信息学院2021年专业硕士研究生(电子信息专业 非全日 ...

  7. 计算机科学与考研技术专业大学排名,2021考研,计算机科学与技术专业学校排名,共168所!...

    哈喽,大家好!非常的感谢大家在百忙之中能够来阅读小编的文章,你们的每一次阅读都是给小编最大的创作动力,在这里小编承诺给带给大家优秀的文章,每一篇都会认认真真的去完成.今天,我们的主题是:2021考研, ...

  8. 厦门大学嘉庚学院的计算机科学与技术专业怎么样啊,张思民教授介绍计算机科学与技术专业和软件工程专业...

    10月22日下午,计算机课程教研室主任张思民教授为2014级计算机科学与技术专业.软件工程专业的新生带来了一场学科专业入门指导讲座. 首先,张思民教授提出了"为什么选择该专业".& ...

  9. 海南大学计算机科学与技术专业考研,2021年海南大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...

    不限 (学硕)(0101)哲学 (学硕)(0201)理论经济学 (学硕)(0202)应用经济学 (专硕)(0251)金融硕士 (专硕)(0252)应用统计硕士 (专硕)(0253)税务硕士 (专硕)( ...

最新文章

  1. ios 导航栏(自己定义和使用系统方式)
  2. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
  3. JS面向对象(二)——构造函数的继承
  4. 经典的十个机器学习算法
  5. 使用Idea添加PYTHONPATH的一种方案
  6. MPEG-7实例入门
  7. 课堂作业(求几个数的最大值)
  8. Java设计模式之——代理设计模式
  9. 数据库悲观锁和乐观锁
  10. 2021年如何折腾小米平板2,装上win11
  11. Python 办公效率化学习(自学)四.Excel文件的写入
  12. 当button具有disabled属性时,el-tooltip也失效。解决办法
  13. 无序列表将点替换成图片
  14. C语言算法扩散墨水,66行C语言计算器,别忘了下载TC编译器!
  15. mysql 轨迹数据存储_基于Tablestore实现海量运动轨迹数据存储
  16. 文字05 自定义字体
  17. Latex语法数学公式参考整理
  18. ioca0中断 pic单片机_PIC单片机
  19. JLayeredPane
  20. AV1标准特色编码工具简介

热门文章

  1. windows编译ffmpeg,支持h264,qsv,aac
  2. LaTeX表格制作(表格内多行组合数据的输入)
  3. 【STM32标准库】【自制库】0.96寸OLED显示屏(SSD1306)(2)全屏动画显示
  4. 『UC Berkeley CS267』Lecture3: More MatMul and the Roofline Performance Model
  5. 日月光华深度学习课程资源详解
  6. QMainWindow statusBar如何添加控件
  7. oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句
  8. 半导体器件与集成电路实验报告 实验二 PN结电容的测量
  9. XShell简介与安装
  10. 上帝视角,什么是生态思维(上)