一、考前准备

带身份证(或学生证)、笔、手表(调准考试机的系统时间)。

二、考试时注意事项

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.in","r",stdin);

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)写广搜时要用队列

练习题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)堆排序