历年市赛分析
历年小学组市赛题单
分析
合肥市
蜀山区
知识点整理
模版题
1.顺序结构
2.分支结构
3.循环结构
4.一维数组
5.数组标记和桶排序
6.字符串
7.函数、素数
8.模拟
9.贪心
10.搜索
11.动规
12.二分
13.其他
二维数组
高精度
A+B Problem(高精度加法) - TopsCoding
A-B Problem(高精度减法) - TopsCoding
A*B Problem(高精度乘法) - TopsCoding
连续性
前缀和
递推
#include<bits/stdc++.h>
using namespace std;
// f[n] = f[n-1] + f[n-2] + …… + f[n-m]
long long n, m, f[55];
int main()
{
cin >> n >> m;
f[0] = 1;
for(int i=1; i<=n; i++)
{
if(i < m)
f[i] = f[i-1]*2; // 无论放还是不放,都不会有连续m个坑里都有
else if(i >= m+1)
f[i] = f[i-1]*2 - f[i-m-1]; // 减去最后有连续 m 个核物质的情况
else if(i == m)
f[i] = f[i-1]*2 - 1; // 减去每个坑里都有核物质这 1 种情况
}
cout << f[n];
return 0;
}
Copy
二维 dp 写法:
#include<bits/stdc++.h>
using namespace std;
const int maxn=60;
long long ans,f[maxn][maxn];
int n,m;
int main()
{
cin>>n>>m;
f[1][0]=1;
f[1][1]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<m;j++)
f[i][0]+=f[i-1][j];
for(int j=1;j<m;j++)
f[i][j]=f[i-1][j-1];
}
for(int i=0;i<m;i++)
ans+=f[n][i];
cout<<ans;
}
Copy
考试流程
1.可以提前1小时进学校
1.先知道厕所在哪
2.把考前注意事项再看看
2.考前15分钟进教室
1.问考场老师厕所在哪,有没有水
2.调试电脑,测试编译器,配置熟悉的代码环境。
3.建好文件夹和.in、.out文件等。
可以把文件放在不会还原的盘,万一机器出现问题,重启了你的代码还在。如果要求在桌面上,最后5分钟可以把这个文件夹拷贝到桌面上。
3.正式考试
1.先用5-10分钟把题目大概读一遍
,有 数据范围的重点关注一下 。
2. 柿子挑软的捏,题目挑简单的做。 我们的目的是拿高分,不是把每一题做出来。
4.每年都有同学犯错
注意 文件名、freopen文件名 ,一般来说可以复制。
如果不能复制,手动写要再三确认是否正确。
freopen一开始就准备好,不要做到一半再回头看看自己的文件名有没有写错。
考前注意事项
一、编译规则
带返回值的函数一定要return,不要漏写,包括main函数的return也要写。
二、写易于调试的代码
1.缩进
2.括号
3.变量名
4.加注释!!!
三、调试流程
1.通过样例
2.手写几组样例
手写样例的建议:
1.边界情况
2.特殊情况
3.二分手写数据
4.随机手写样例
输出调试
1.写.in和.out文件,调试的时候把.out注释掉。
小黄鸭调试法:
检查代码的时候向自己提问,每一步操作都要搞明白。
四、骗分
1.暴力(重点!!!)
考虑双for、三for或其他暴力枚举法。
比如 合肥市历年就喜欢考这种 :
再比如 2021蜀山区第三题(暴力解法70分!!!) :
2.打表
预先把正确答案算出来。
比如:int a[1000]={0,答案的第一个数,答案的第二个数,。。。。};
然后写一个如下的程序:
int main()
{
cin>>n;
cout<<a[n];
return 0;
}
Copy
3.面对不确定的正解时,手写函数
int main()
{
if(n<=100)
{
f1();//暴力方法
}
else
{
f2();//不太确定的正确解法
}
return 0;
}
Copy
4.无奈之举,输出错误情况
int main()
{
if(n<=100)
{
f1();//暴力方法
}
else
{
cout<<-1;//按照题目的要求输出
}
return 0;
}
Copy
5.对拍
之前写的正确程序(但速度慢或其他情况)不要删除,可以检测 优化之后的代码(正解) 是不是正确的。