校赛/ACM初级纸质备战资料

写在前面:

事先声明:

我这篇文章面向的是大一的计院新生,可以说在大一上并没有接触到太多的算法,这篇文章的资料也仅仅只能应付大一11月或12月举行的一些校赛选拔赛等小型基础型初级编程竞赛

再者,我认为要准备中等级别的ACM或高等级别的ACM,纸质的备战资料应该高度私人化,因为每个选手掌握的情况不一样,不能简单的去网络拷贝和复制下来。

我们知道,像ACM一样的比赛都是可以带纸质资料参加的,那,带什么资料来最大化利用这个规则就显得尤为重要了。

有些人会带写算法书,诚然,如果这本书的全部算法你都学过,并且真正实操过,那在赛场,你在遗忘一些算法的时候翻看会对你有极大的帮助,当然,这是要建立在你

本书的全部算法你都学过,并且真正实操过

否则,现场学习算法并能实际运用去解题,那有点天方夜谭,当然如果你能够这样你的水平还是挺高的。

有些人会带C PRIMER 等这类的系统教学书籍,以防自己忘记一些基础知识,但…既然你都忘记基础知识了,你写代码的时候未必都能检查地出来你犯下地基础性错误,且效率也很低,这个工作应该放在比赛前进行。

所以,我这篇文章侧重于准备一些自己容易遗忘的 但对解题有极大帮助的内容,综合了上面的算法和基础知识,用好了能够让你解题事半功倍

因为这篇文章我自己在比赛时也会打印出来用,故说明文字会比较少,主要就是模板,有不懂的可以留言,我会逐一回答

文章目录

  • 校赛/ACM初级纸质备战资料
    • 写在前面:
  • 细节篇
    • 一、最大最小初始化值
    • 二、提升编程速度
    • 三、格式输出问题
  • 算法篇
    • 一、解题突破口
    • 二、动态规划标准解题流程
    • 三、常见DP模型
    • 四、递归设计流程
    • 五、递归优化二解
    • 六、求最大公约数函数
    • 七、求素数函数
    • 八、四舍五入
  • 基础篇
    • 一、高频常见函数的使用
  • 特殊情况篇
    • 一、常见OJ返回结果
    • 二、调试小技巧
    • 三、其他问题
  • 基础图表篇:
  • 写在后面:

这篇文章的纸质PDF文件我已经上传百度网盘,若有需要可以关注微信公众号error13,回复ACM资料即可免费获得资源~


细节篇

一、最大最小初始化值

相信很多基础题目都涉及到最大最小初始化值的问题,下面给几个模板

const int maxn=0x3f3f3f3f;

一、全部设置为0

memset(a,0,sizeof(a));

二、全部设置为-1

memset(a,-1,sizeof(a));
memset(a,0xff,sizeof(a));

三、设置为无穷大

memset(a,0x7f,sizeof(a));memset(a,0x3f,sizeof(a));

四、设置为无穷小

memset(a,0xFE,sizeof(a)); //intmemset(a,0x80,sizeof(a)); //double

五、求最值问题

法一:擂台法

法二:排序法

二、提升编程速度

#include <bits/stdc++.h>
#define ll long long

下面这些是我从这个博主学到的~

#define fi(i, x, y) for (int i=x; i<=y; ++i)
#define fd(i, x, y) for (int i=x; i>=y; --i)
int getint()
{char ch;int res = 0, p;while (!isdigit(ch = getchar()) && (ch ^ '-'));p = ch == '-'? ch = getchar(), -1 : 1;while (isdigit(ch))res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();return res * p;
}

三、格式输出问题

直到000停止输入

 while ( 1 ){scanf ( "%d %d %d", &x, &y, &num );if ( !x && !y && !num )break;a[x][y] = num; }

多组数据输入直到EOF

while(~scanf("%d",&a)

算法篇

一、解题突破口

下面几句话是我自己总结的,给看到题目没有思路的时候用

遇事不决就排序

实在不行先打表

字符串问题大多动规

低维DP不行果断上高维

毫无头绪扫雷吧

二、动态规划标准解题流程

如果你还不太懂动态规划,强行推荐我写的一篇27k字的文章,覆盖了绝大多数的DP题型

动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解

知乎版本

DP设计

1.明确到底是几维的DP,是否有必要升级维数或降低

2.如何将大问题化为小问题

3.定义数组元素的含义,存放的数值的意义所在

4.找出DP状态转移方程

5.找出初始值、注意临界值,递推/递归总设计思路

三、常见DP模型

只是为了解DP题没思路的时候看看

过桥问题

dp[i] = min ( ( dp[i-1] + a[0] + a[i] ),( dp[i-2] + a[0] + a[i] + 2*a[1] ) )

最长递增子序列

 for ( j=1; j<len; j++ )for ( i=0; i<j; i++ )if ( a[j]>a[i] && dp[j]<dp[i]+1 )dp[j] = dp[i]+1;

DIO的面包工坊

for (int i=4; i<=100; i++)
{for (int j=1; j<=i/2; j++){if (a[i] <= a[j] * a[i-j])a[i] = a[j] * a[i-j];}
}

插入回文串

dp[i][j] = min( palindrome(i+1,j)+1, palindrome(i,j-1)+1  );

最长回文子序列

if ( c1[i] == c2[j] )dp[i][j] = dp[i-1][j-1]+1;
elsedp[i][j] = max(dp[i][j-1], dp[i-1][j] );

最小路径和

dp[i][j] = min ( dp[i-1][j], dp[i][j-1] ) + grid[i][j]

过河卒

a[i][j] = a[i-1][j] + a[i][j-1];

方格取数

dp[i][j][k][l] =
max ( dp[i-1][j][k-1][l], dp[i-1][j][k][l-1], dp[i][j-1][k-1][l], dp[i][j-1][k][l-1] ) + a[i][j] + a[k][l]

缺席的神官

dp[i] = dp[i-1] - max

四、递归设计流程

递归设计

1.明确函数的功能和目的

2.首先明确基线条件

3.设计递归条件,寻找前后等价关系

4.大数据优化为记忆化递归

五、递归优化二解

自身判断记忆,例题在这

memset(dp,-1,sizeof(dp));int palindrome( int i, int j )
{if ( i>=j )return 0;if ( dp[i][j] >= 0 )return dp[i][j];if ( s[i] != s[j] )dp[i][j] = min( palindrome(i+1,j)+1, palindrome(i,j-1)+1  );           elsedp[i][j] = palindrome(i+1,j-1);           return dp[i][j];
}

专门开个mark数组记忆

int palindrome( int i, int j )
{if ( i>=j )return 0;if ( mark[i][j] == 1 )return dp[i][j];if ( s[i] != s[j] ){dp[i][j] = min( palindrome(i+1,j)+1, palindrome(i,j-1)+1  );mark[i][j] = 1;}         else{dp[i][j] = palindrome(i+1,j-1);mark[i][j] = 1;  }return dp[i][j];
}

六、求最大公约数函数

int gdc(int m, int n)
{int t;if ( m<n ){t = m;m = n;n = t;}if ( m==0 )return m;if ( n==0 )return n;int yu = m%n;int ans = n;while ( yu!=0 ){m = n;n = yu;yu = m%n;ans = n;}return ans;
}

七、求素数函数

bool judge(int num)
{int i;for ( i=2; i<sqrt(num); i++ )if ( num%i == 0 )return 0;return 1;
}

八、四舍五入

floor(x+0.5)

基础篇

一、高频常见函数的使用

sort函数(默认升序)

sort(start,end,cmp)
bool cmp(int a, int b){return a>b;
}

sort高级多重排序

假设自己定义了一个结构体node

struct node
{
int a;
int b;
double c;
}
123456

有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写一个比较函数:

以下是代码片段:

bool cmp(node x,node y)
{
if(x.a!==y.a) return x.a<y.a;
if(x.b!==y.b) return x.b>y.b;
return x.c>y.c;
}

gets()函数

在C中

scanf("%s",c)gets(c)

两者是不同的,上一个以空格为分隔符,只要读到输入了空格,就终止读入(不包括空格)

而后者会把整个句子都读入,包括空格,以回车结束输入。

getline()函数

string s7;getline(cin,s7);

C++中string用法

#include <iostream>
//记得要引入头文件string才能使用
#include <string>
using namespace std;int main()
{string s1 = "Today is ";string s2 = "2020/11/6";//直接将s1和s2拼接起来 string s3 = s1+s2;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;//在C++中用.length获取字符串长度,可以类比vector//在这里的length是不包括最后的\0的,就不用担心啦!cout << s1.length() << endl;//将13个全设置为字符z string s4(13,'z');cout << s4 << endl;//直接复制字符串到s5 string s5 = s3;cout << s5 << endl;//与C中相同 这里cin读到空格就结束 getline则包括空格 string s6;cout << "Please enter a string:" << endl;cin >> s6;cout << s6;cout << endl;string s7;cout << "Please enter a string:" << endl;getline(cin,s7);cout << s7;return 0;}

reverse()函数

void reverse ( a, b)

将[a,b)内的字符反转,注意first包含,b不包含

即如果用char s1[]

reverse(s1,s1+strlen(s1));

如果用string s2

reverse(s2.begin(),s2.end());

isprint()isalpha() isdigit()函数

判断是否为打印字符、字母、数字

tolower() / toupper()函数

原数值不变,将字符变为小写/大写

strlwr() / strupr() 函数

将字符串改为小写/大写

floor() / ceil() 函数

返回浮点类型中小于/大于此数的最大/小整数

fill()函数

将数组初始化

fill(a,b,c)

a起始地址

b结束地址

c初始化的值

其他杂七杂八


特殊情况篇

一、常见OJ返回结果

AC (Accepted) 程序通过

可喜可贺可喜可贺

WA (Wrong Answer) 错误的答案

算法、思维根本错误

PE (Presentation Error) 输出格式错误

空格、回车、换行、大小写检查一遍

RE (Runtime Error) 程序执行错误

数组下标溢出,指针错误

CE (Compile Error) 编译错误

语法错误

MLE (Memory Limit Exceeded) 内存超界

优化空间,滚动数组

TLE (Time Limit Exceed) 程序超时错误

优化时间,可能存在死循环,重点关注递归,记忆化搜索

OLE (Output Limit Exceed) 输出超界

输出结果过大

二、调试小技巧

注释法:

主要用于排查哪一句有语法错误(系统检查不出来,但编译却报错)

输出法:

在合适的位置添加

cout << a << endl;

便于检查每一个变量在过程中是否如你所愿的改变,到底是哪一步出了问题

三、其他问题

感觉自己的算法没问题,但是结果总是那么匪夷所思?

就我个人而言,遇到这种情况最大的原因就是

写的代码和你想的不一样

就是你的一些小问题导致了这个结果,比如:

1.以为自己用对变量了,但其实变量用混了

2.多组数据的时候重置数据

3.句子放的位置不对,在括号外面还是括号里面

4.==有没有写成=

5.while有没有写成if

6.{}有没有必要不打

7.else配对的情况是不是如你所愿

8.有没有死循环

9.忘记初始化,原来存放的数据什么样的都有

10.遍历时的范围,有没有多遍历或排序使越界数据进入

11.临界情况考虑周全了吗?

12.判断条件写对了吗?是>还是>=

13.运算符优先级记错了吗?

14.是否漏考虑了一些情况?

15.数据类型是否正确,可能存在溢出风险吗?


基础图表篇:



写在后面:

为了确保大家能够看懂这篇文章,我尽量每字每句都详细讲解,给出证明和解释,真心希望你能够在阅读此篇文章后从中多多少少有所收获。因此每篇文章我都投入了大量的时间和精力,去举例,去说明,去分析,如果你觉得这篇文章写的还不错,点赞、关注和收藏一键三连就是对我最大的鼓励啦,我以后也会写更多更高质量的文章!也欢迎一起讨论指出文章可能存在的逻辑问题~

开通了微信公众号 欢迎关注~精选CSDN的文章发布 更优质的排版 更丰富的学习资源分享

这篇文章的纸质PDF文件我已经上传百度网盘,若有需要可以关注微信公众号error13,回复ACM资料即可免费获得资源~

[Error]校赛/ACM初级纸质备战资料——刷题大总结相关推荐

  1. 计算机二级不看教材只刷题可以吗,初级会计备考只刷题不买教材行不行?可以通过吗?...

    2021年开始咯~各位小伙伴们开始备考初级职称的考试了吗?肯定有很多积极的小伙伴很早就开始备战了吧~最近小编收到不少同学的备考疑问,其中问的最多就是关于备考期间只刷题不买教材不看理论行不行?这样的备考 ...

  2. 【ACM】漫漫长路——刷题(8)

    先分享一下百度的杭电刷题推荐路线: 杭电OJ刷题顺序推荐 第一阶段:开始入门!(15天,53题)  一.输入输出练习(2天,10题)  1000.1089-1096.1001  二.简单操作(2-4天 ...

  3. 第一次ACM校赛_记录

    [2021-10-24]第一次ACM校赛 一.报名 1.去年比赛 2.流程 二.准备 1.核心代码模式和ACM代码模式 1.1核心代码模式 1.2 ACM代码模式 2.往年题目 3.机房环境 3.1语 ...

  4. 一个彻彻底底的水军的ACM校赛感悟~~~

    2017年4月23日刚刚结束了ACM校赛.作为一名不是ACM队的水军来说,抱着必突突突的决心,参加了这次的比赛.经过五个小时的激烈角逐,我们队伍还参加了一场和我们没有什么关系的颁奖典礼. 我是一个编程 ...

  5. 记第七届ACM校赛-回忆

    这一次校赛其实是两个月半之前的事情了---4月29日.那天比赛完之后,自己就想当天写写这一次比赛的事,但是由于那天比赛完之后又马上又赶回家,5个小时的比赛加上2个小时的车程,整个人都觉得很累,所以那天 ...

  6. [置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解

    8题只做出4题比较easy的题,而且做得挺麻烦,看来还要多练练. AC的题如下 NEUOJ  1112 I Love Apple Description So many people love app ...

  7. 山东科技大学第二届ACM校赛解题报告

    这次校赛的目的,是为了省赛测试各种程序是否有问题. 热身赛的逗比题有点打击我,感觉正式赛应该不会出这种问题.开始的时候直接上了A题,然后大概是第六,前面好多友情队,正式队排名第二. 然后读了读B题,稍 ...

  8. 2014湖南农业大学ACM校赛

    湖南农业大学 2014年 ACM 校赛Problem 2014 /2/23  星期日  12:30-17:30 A.搜素      1794.查找指定的字符串      B.链表      1795 ...

  9. “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 F.校赛~校赛~【思维+规律题】

    校赛~校赛~ Time Limit: 1000MS  Memory Limit: 65536KB Submit  Statistic Problem Description SDUT 的校赛是从 20 ...

最新文章

  1. 树上问题 ---- E. Fib-tree(斐波那契数的性质 + 暴力模拟 + 认真计算复杂度)
  2. canvas初体验之加载图片
  3. 在HTML中,如何设置新窗口打开和在原窗口打开
  4. hp-socket 文本跟图片同时发送_文本、截图和应用,这样「包装」一秒变美观
  5. linux上的web服务器搭建
  6. YOLOv3 精度再次提高 4.3%,训练提速 40%!PaddleDetection全面升级
  7. Android入门之简单拨号器
  8. Linux操作Oracle(11)——Oracle用户密码过期 设置密码永不过期方法
  9. Linux内核同步机制--自旋锁【转】
  10. android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)...
  11. CAM350测量pcb尺寸的操作方法
  12. 苹果电脑mac计算机图标怎么删除吗,苹果电脑桌面的图标怎么删除不了怎么办
  13. 【解决方法】Windows Server 2016/2019无法安装Flash
  14. 【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?
  15. 使用pandas批量重命名(指定Excel中的对应列)
  16. cnpm 新版本替换,及randomUUID is not a function问题解决
  17. 【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】
  18. 桌面远程连接工具哪款最好用
  19. ICN:SDN后的下一个热潮
  20. Java学习笔记--Java中必记常见异常

热门文章

  1. c4d物体自发光_如何使用C4D制作发光的球体?C4D怎么制作发光的球体
  2. 购买企业邮箱,哪个邮箱最好用?邮件撤回怎么操作?
  3. Python requests 传递布尔值
  4. Android中获取当前时间戳
  5. Overture钢琴打谱软件出官方简体中文版啦
  6. Dubbo——通信框架与通信协议(dubbo协议)原理
  7. 高洁的品格,隐逸的情怀
  8. html分享标题描述图片尺寸,微信分享网页时自定义标题、描述和图片
  9. Win10系统设置护眼色
  10. Android 并发/多线程 的基础与应用