2020-02-11
实现梦想其实没什么诀窍,就是比别人早起一点,晚睡一点,比别人早准备一点,勤奋一点。考研也一样。
一个写不出合格代码的计算机专业的学生,即便侥幸考上了研究生,也不过是给将来的失业判个缓期执行而已。
【1_从零开始】
- 机试考察的能力:
-
- 将实际问题抽象成数学问题
- 将专业知识运用到数学模型
- 将设计的算法编写成可执行程序
(其中包括1:会编写经典算法的程序代码 2:能将自己设计的算法转换为程序代码 3:健壮性,即所写程序能应对各种测试数据)
- 特殊判题(Special Judge):此类题可能存在多个符合条件分答案,要求输出任意一组解即可
- 大多数考题只对时间做限制,此时要有“空间换时间”的思想。11:52:07
【2_经典入门】12:25:59
【2.1_排序】
【2.1.1_对基本数据类型排序】
- 需要连续测试多组数据时,循环条件该怎么写?
while(scanf("%d",&n)!=EOF)
- scanf()是有返回值的,它将返回输入函数成功赋值的变量个数(此例中为1个,即n)
- EOF(end of file)的值为-1,当scanf函数不再为n赋值时返回EOF,跳出循环
- 使用该循环判断条件是为了:既能测试多组数据,又能在输入结束后正常退出。
- 不同编译环境下for循环中指示变量 i 的作用域不同
- C++标准中,i 的作用域仅限于for循环内部;于是我们可以在多个for循环中都重新定义变量 i
- VC6.0中,在退出for循环后,变量 i 依然可见;因此在后续for循环中不必重新定义 i ,只需将 i 初始化即可。
- 冒泡排序
1 for(int i = 0; i < n; i ++){
2 for(j = 0; j < n-1-i; j ++){
3 if(buf[j] > buf[j + 1]){
4 int tmp = buf[j];
5 buf[j] = buf[j + 1];
6 buf[j + 1] = tmp;
7 }
8 }
9 }
C++有快速排序库函数,可通过包含#include<algorithm>头文件后直接调用
- sort(first,last,cmp)函数
可省略第三个参数,此时默认为升序排列
若想得到降序排列的结果,可以改写cmp(),默认return x<y; 改为 return y<x;13:52:24
sort()函数根据小于运算符“<”来定序,小者在前。
【2.1.2_对结构体排序】
- 重新定义比较函数cmp()
1 struct stu{
2 char name[101];
3 int age;
4 int score;
5 }buf[1000];
6 bool cmp(stu a, stu b){
7 if(a.score != b.score) return a.score < b.score
8 int tmp = strcmp(a.name , b.name);
9 if(tmp != 0) return tmp<0;
10 else return a.age < b.age
11 }
- 另外,还可以在stu结构体内重载“小于运算符”即operator <(),来说明排序规则,此时sort()函数不必使第三个参数。(提倡使用)
1 struct stu{
2 char name[101];
3 int age;
4 int score;
5 bool operator < (const stu &b) const {
6 if (score != b.score) return score < b.score;
7 int tmp = strcmp(name , b.name);
8 if(tmp != 0) return tmp < 0;
9 else return age < b.age;
10 }
11 }buf[1000];
【2.2_日期类问题】
【2.2.1_日期差值(区间问题)】
Guide:把原区间问题统一到起点确定的区间问题上
比如该日期与原点时间0000年1月1日之间的天数差
这样可以在程序真正开始之前进行预处理——算出所有日期与原点日期的天数差并保存起来
- 需要开辟大量内存空间(如buf[5001][13][32])时
- 定义在函数体外,即全局变量
- 在函数中用malloc等函数动态申请变量空间
预处理是空间换时间的重要手段。
- 闰年
1 #define ISYEAP(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0
定义一个宏用来判断是否是闰年
将数据本身与数据的存储地址联系起来,是Hash的基本思想。
- 对于最常见的时间限制 1秒,算法复杂度通常不能超过百万级别(7位),最多7位
【2.2.2_求星期几】2020-02-11 18:05:25
2020-02-12 10:46:57
法一:
思路:仍以0000年1月1日为原点日期,处理出每个日期与原点日期之间的天数差,再求出给定日期与今天之间的天数差,又知道今天是星期几,对天数差除7取余即可。
法二:
利用蔡勒(Zeller)公式,具体如下 图片内容来自知乎https://zhuanlan.zhihu.com/p/79290515
——From《王道论坛计算机考研机试指南》