一、考前准备
带身份证(或学生证)、笔、手表(调准考试机的系统时间)。
二、考试时注意事项
1、解压考试文件。
2、建好考试文件夹,生成考试题目文件,默写头文件,调试一下程序,写输入输出文件,
(1)默写头文件(加上‘//’的为不常用的)
#include<cstdio>#include<cstdlib>//
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>//
#include<stack>
#include<queue>
#include<set>//
#include<vector>//
#include<cctype>//
#include<ctime>//
#include<list>//
#include<climits>
(2)文件输入输出
freopen("1.out","w",stdout);
fclose(stdin);fclose(stdout);
return 0;
(3)静态查错,制造特殊数据(极小,极大,全相等,分母不等于0)
(4)随机函数自动生成数据,对拍程序。(加上#include<ctime>)
srand((unsigned)time(NULL));
x=rand()%100;
三、知识结构
1、高精度(这部分练习题为noi.openjudge.cn网站上的)
(1)高精度加法
代码:
#include<cstdio>
#include<cstring>
int e[205],c[205],d[205];
int main()
{
char a[205],b[205];
int lena,lenb,i,v,x=0;
v=0;
scanf("%s",a);
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
for(i=lena-1;i>=0;i--){
c[v]=a[i]-48;
v++;
}
v=0;
for(i=lenb-1;i>=0;i--){
d[v]=b[i]-48;
v++;
}
if(lena<lenb)
lena=lenb;
for(i=0;i<=lena-1;i++){
e[i]=c[i]+d[i];
}
for(i=0;i<=lena-1;i++){
if(e[i]>=10){
e[i]=e[i]-10;
e[i+1]++;
}
}
for(i=204;i>0;i--)
if(e[i]!=0) break;
for(;i>=0;i--)
printf("%d",e[i]);
}
(2)高精度减法
代码:
#include<cstdio>
#include<cstring>
int e[205],c[205],d[205];
int main()
{
char a[205],b[205];
int lena,lenb,i,v,x=0;
v=0;
scanf("%s",a);
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
for(i=lena-1;i>=0;i--){
c[v]=a[i]-48;
v++;
}
v=0;
for(i=lenb-1;i>=0;i--){
d[v]=b[i]-48;
v++;
}
for(i=0;i<=lena-1;i++){
e[i]=c[i]-d[i];
}
for(i=0;i<=lena-1;i++){
if(e[i]<0){
e[i]=e[i]+10;
e[i+1]--;
}
}
for(i=204;i>0;i--)
if(e[i]!=0) break;
for(;i>=0;i--)
printf("%d",e[i]);
}
(3)高精乘低精
代码:
#include<cstdio>
int main()
{
int i,v,n,c[205]={0};
c[0]=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(v=0;v<=204;v++){
c[v]=c[v]*2;
}
for(v=0;v<=204;v++){
if(c[v]>=10){
c[v]=c[v]-10;
c[v+1]++;
}
}
}
for(i=204;i>0;i--)
if(c[i]!=0) break;
for(;i>=0;i--)
printf("%d",c[i]);
}
(4)高精乘高精
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
char a1[205],b1[205];
int a[205],b[205],c[415],lena,lenb,lenc,i,j,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);
gets(b1);
lena=strlen(a1);
lenb=strlen(b1);
for(i=0;i<=lena-1;i++)
a[lena-i]=a1[i]-48;
for(i=0;i<=lenb-1;i++)
b[lenb-i]=b1[i]-48;
for(i=1;i<=lena;i++){
x=0;
for(j=1;j<=lenb;j++){
c[i+j-1]+=a[i]*b[j]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+lenb]=x;
}
lenc=lena+lenb;
while(c[lenc]==0&&lenc>1)
lenc--;
for(i=lenc;i>=1;i--)
printf("%d",c[i]);
}
(5)高精除低精
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
char a1[105];
int a[105],c[104],lena,lenc,i,x=0;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
gets(a1);
lena=strlen(a1);
for(i=0;i<=lena-1;i++)
a[i+1]=a1[i]-48;
for(i=1;i<=lena;i++){
c[i]=(x*10+a[i])/13;
x=(x*10+a[i])%13;
}
lenc=1;
while(c[lenc]==0&&lenc<lena)
lenc++;
for(i=lenc;i<=lena;i++)
printf("%d",c[i]);
printf("\n");
printf("%d",x);
}
2、排序算法
(1)sort算法
(2)结构体排序(重载运算符)
(3)归并排序
(4)堆排序
3、递归、递推
(1)5种递推关系(Fibonacci、Hanoi、平面分割、Catalan、Stirling)
(2)注意递归的边界
(3)推递推关系式
4、深搜、广搜
(1)写深搜时要注意回溯
(2)写广搜时要用队列
5、贪心
(1)要贪对方向
(2)要判断这道题是否是贪心
(3)要注意贪心的局限性
6、分治
(1)二分答案
(2)求逆序对
(3)二分查找
(4)归并排序
7、动态规划
(1)背包问题
(2)求状态转移方程
(3)无后效性和最优化原理
8、图论
(1)最短路径(Floyed、Dijkstra、Bellman-Ford、SPFA)
(2)最小生成树(Prim、Kruskal)
(3)并查集
(4)求强连通分量(Kosaraju)
9、二叉树
(1)建立二叉树
(2)先序遍历、中序遍历、后序遍历
(3)二叉树的计数
10、堆
(1)堆的维护
(2)堆排序