NOIP在半期后第一天。尽管半期考试已经使我丧失了思考的能力……
改错本
必须剁手的错误
头文件
由于编译器的原因,某些头文件没打,却没有报错……
以下几个头文件不管怎么先打上:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
等号
学了那么久,却仍然会这样打:
if(a=b)
printf("Maybe there's something wrong.");
可怕的是,C允许我们这样写【手动吐血】……
long long
该用的时候还是用吧……
(我不会告诉你我现在想把所有整形变量定义成long long)
我是谁我在哪我在做什么
数组越界
看这段代码:
#define MAXN 105//我把数组开大了的哦~
int C[MAXN][MAXN];
void init()
{
C[1][1]=1;
for(int i=2;i<=MAXN;i++)
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
//不要在意我写错没有
第6行那个刺眼的i<=MAXN
,让你的程序和人直接崩溃。
清零
你的vis清零了吗?你的cnt清零了吗?你的ans清零了吗?你的各种该清0的、该清1的清了吗?
以后只要有这种:
while(~scanf("%d%d",&N,&M))
{
}
或者是这种:
while(1)
{
scanf("%d%d",&N,&M);
if(!N&&!M) break;
}
一定要加上诸如:
ans=0;
memset(vis,,0,sizeof vis);
memset(Edge,0,sizeof Edge);
读入换行
每当题目的输入中有字符型时,一切都变得朦胧起来……
说白了就是空格和换行符被莫名其妙地读进去了。
接下来总结一下:
scanf
:
当读入字符串时:读到制表符(空格、换行等)时结束,且不会把制表符读入;
当读单个字符时:什么都会读。
gets
:不要用!不要用!不要用!
fgets
:读入一行字符串,遇到空格会继续读,且把空格储存下来,遇到换行停止,且会把换行读入进去。
getchar
:读入任意一个字符。
算法总结
搜索
枚举枚上天,暴力出奇迹 ——题记
深搜
void dfs(参数)
{
if(边界)
{
记录结果
return;
}
for(枚举这一步的所有情况)
if(没有访问过)
{
标记
dfs(改变参数);
//取消标记
}
}
广搜
queue<node> Q;//定义在外面,自动清零
void bfs()
{
Q.push(初始状态);
标记初始状态//注意!!
while(!Q.empty())
{
node t=Q.front();
if(t为最终状态) 输出结果
for(枚举t可以得到的状态)
if(没有访问过)
{
标记
Q.push(这个状态);
}
Q.pop();
}
}
广搜写得少,例题:【NOI2001】聪明的打字员
贪心
贪心只能过样例 ——题记