保研考研机试攻略(满分篇):第一章——技巧之巅(1)

2024-08-26 14:20

本文主要是介绍保研考研机试攻略(满分篇):第一章——技巧之巅(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🍨🍨🍨从这章开始,我们就告别满分篇进入满分篇啦~

这一章,我们一起来领略技巧的极致魅力,包括:输入输出加速外挂、调试技巧、位运算技巧、考试最佳策略、预处理与打表技巧、对数器技巧等内容。

目录

🧊🧊🧊1.1 输入输出加速外挂

🧊🧊🧊1.2 调试技巧

说一些我常用的调试位置:

🧊🧊🧊1.3 位运算技巧

速度比较

异或运算的特殊性

🥥例题:DreamJudge 1506

常见位运算问题

1. 位操作实现乘除法

2. 取相反数

3. 判断奇偶性

4. 不用临时变量交换两个数

5. 统计二进制中 1 的个数

🥥练习题目:

DreamJudge 1118 将军的书 🍰


🧊🧊🧊1.1 输入输出加速外挂

有的时候题目的输入数据量比较大,比如要输入 10W 和数字进行排序,这个时候,如果我们直接使用 C++的 cin 和 cout 函数进行输入输出,有很大的概率会超出题目的时间限制。

在这种情况下,需要的优化的就不再是算法过程,而是读写数据的速度优化。

使用 cin 和 cout 函数进行输入输出时,在 main()里首先写入下面两行代码:

ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);

如果题目的输入量巨大,比如要输入 100W 个数字,这个时候我们最好使用 C 语言的 scanf 和 printf 语句进行输入输出:

//适用于正负整数
template <class T>
inline bool scan_d(T &ret) {char c; int sgn;if(c=getchar(),c==EOF) return 0; //EOFwhile(c!='-'&&(c<'0'||c>'9')) c=getchar();sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');ret*=sgn;return 1;
}
inline void out(int x) {if(x>9) out(x/10);putchar(x%10+'0');
}

加速外挂原理: getchar 的速度 快于 scanf 的速度

速度比较:

getchar > scanf > cin

putchar > printf > cout

// 求 1 + n 的和
#include <bits/stdc++.h>
using namespace std;
//适用于正负整数
template <class T>
inline bool scan_d(T &ret) {char c; int sgn;if(c=getchar(),c==EOF) return 0; //EOFwhile(c!='-'&&(c<'0'||c>'9')) c=getchar();sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');ret*=sgn;return 1;
}
inline void out(int x) {if(x>9) out(x/10);putchar(x%10+'0');
}
// 请注意只有在大量输入或大量输出的时候才能看出时间的区别
int main() {int n;scan_d(n); //加速输入long long sum = 0;for (int i = 1; i <= n; i++)sum += i;out(sum); //加速输出return 0;
}

🧊🧊🧊1.2 调试技巧

调试是我们在编写程序时不得不经历的过程,这一节我们来学习快速定位错误的调试技巧

不太建议使用断点调试,虽然这是很常用的一种方法,但是我们的机试往往有一些特殊的情况:

1、机试的代码往往很短,几行到几十行不等。

2、比赛中争分夺秒,我们对调试时间要求更为迫切。

3、我们的错误往往是由于代码细节没考虑周全导致的。

所以,断点调试更适于项目代码中且对时间的迫切度没有那么高的情况

接下来,我们来学习一种超级棒的调试方法:输出调试

简言之,就是通过输出一些数据或标志来进行调试

说一些我常用的调试位置:

  1. 在for循环和while循环中输出一个自定义的字符串,比如yes、no等,可以判断是否陷入死循环;
  2. 在if语句大括号内加入一个输出字符串,可以判断是否按规则进入我们指定的代码区域;
  3. 在某些部分输出数组数据,可以判断某一时刻的数据处理是否正确……

教程中提到了下边的定位方法,说实话,我没看懂,懂的宝子欢迎评论区告诉我们:

大部分没有足够调试经验的同学使用输出调试的时候,不知道应该如何使用输出调试。如果从前往后逐条语句输出调试去排查错误,那么很容易要找很久。反之从后往前逐条语句输出调试去排查错误,那么也很容易要找很久。其实,观察上面两种方法,我们发现就是顺序查找的方法。那么,与此对应的就应该是二分查找的方法。

使用二分查找的思想来调试定位错误,可以更快,更节约时间。

特别注意:输出调试完成之后提交代码之前一定要删除或注释掉调试信息。

🧊🧊🧊1.3 位运算技巧

速度比较

我们之所以要进行位运算优化,是因为:取模时间 > 四则运算时间 > 位运算时间

所以对于一个语句

if (a % 2 == 1) {a /= 2;
}

可以优化为:

if (a & 1 == 1) {a >>= 1;
}

异或运算的特殊性

异或同一个数 2 次或者偶数次,那么本身的值不变。

例如:

a^b^b = a

x^y^y^y^y = x

这是一个很好用的性质,接下来我们来看一下它的应用:

🥥例题:DreamJudge 1506

由于本题要求我们以尽量小的空间来解决问题,所以我们不能够使用数组来存储每一个数。那么我们应该怎么办呢?这个时候可以想到异或运算的特殊技巧,同一个数异或两次那么就会消除,如果我们提前将 1 到 N 的所有数字进行异或处理,然后再去异或输入的N-1个数,那么答案就是缺失的那个数。

#include<bits/stdc++.h>
using namespace std;
int main(){int n, x;scanf("%d", &n);int sum = 0;for (int i = 1; i <= n; i++) {sum ^= i;}for (int i = 1; i < n; i++) {scanf("%d", &x);sum ^= x;}printf("%d\n", sum);return 0;
}

常见位运算问题

1. 位操作实现乘除法

数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2

int a = 2;
a >> 1; ---> 1
a << 1; ---> 4

2. 取相反数

思路就是取反并加 1,也即~n + 1 或者(n ^ -1) + 1。 相当于补码

3. 判断奇偶性

/* 判断是否是奇数 */
bool is_odd(int n)
{return (n & 1 == 1);
}

4. 不用临时变量交换两个数

a ^= b;
b ^= a; // 相当于 b = b ^ ( a ^ b );
a ^= b; 

5. 统计二进制中 1 的个数

count = 0
while(a){a = a & (a - 1);count++;
}

🥥练习题目:

DreamJudge 1118 将军的书 🍰

//摘自N诺用户:滴滴答答
#include<bits/stdc++.h>
using namespace std;
int main()
{bitset<22>num;long N,res;while(cin>>N){N=(1<<N)-1;//左移N位,也就是连续N次乘2for(int i=res=0;i<N;i++){cin>>num;res^=num.to_ulong();//该函数将bitset对象中的二进制位转换为一个unsigned long类型的整数}cout<<res<<endl;}return 0;
}

创作不易,点个赞吧~点赞收藏不迷路,感兴趣的宝子们欢迎关注该专栏~

勤奋努力的宝子们,学习辛苦了!宝子们可以收藏起来慢慢学哦~🌷🌷🌷休息下,我们下部分再见👋( •̀ ω •́ )✧~

这篇关于保研考研机试攻略(满分篇):第一章——技巧之巅(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108804

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

企业大模型落地的“最后一公里”攻略

一、大模型落地的行业现状与前景 大模型在多个行业展现出强大的应用潜力。在金融行业,沉淀了大量高质量数据,各金融平台用户数以亿计,交易数据浩如烟海。利用大模型分析处理这些数据,金融机构可以预测用户行为偏好,更高效、准确评估客户风险,实时监测交易和市场波动,及时制定策略。IDC 调研显示,超半数的金融机构计划在 2023 年投资生成式人工智能技术。 在科技领域,商汤人工智能大装置为大模型企业提