低级错误集合

文件错误

1.文件名打错

2018.10.11
T1:

	freopen("forging","r",stdin);
	freopen("forging","w",stdout);

看着好像没什么不对??

	freopen("forging.in","r",stdin);
	freopen("forging.out","w",stdout);

100分惨变0分
总分150惨变50分
rk5惨变rk22


内存错误

1.数组开小

2018.9.21
T1(bzoj5218友好城市):

const int N=155,M=3e5+10,MX=5e4+10;
struct Q{int l,r,id;}qr[MX];

emmm,实际上询问是 3 e 5 3e5 3e5

const int N=155,M=3e5+10,MX=5e4+10;
struct Q{int l,r,id;}qr[M];

100分惨变30分
总分190惨变120
rk1惨变rk2
const数组常量最好不要开多个,很容易混淆

2.赋值错误

2018.10.17
用memcpy把大小为1e5的数组a copy到了nxt大小为15的数组里(Windows下居然正常运行, l i n u x linux linux评测就RE了)。

memcpy(nxt,a,sizeof(a))

爆int

这类错误几个月前犯的很多。


变量名打错/错用全局变量

2018.10.8
T2:

printf("%d\n",(f[x][m][K]+f[z][m][K])%mod);

emmm,实际上这里应该是上一个y

printf("%d\n",(f[x][m][K]+f[y][m][K])%mod);

i,j打反,顺手数组打错等等。

2019.4.2

rv=atan2(p[x].y,p[x].x);

写成了atan2(y,x),调半天

原因:

  1. 码的时候过于着急
  2. 注重速度的同时没有仔细看自己打的代码(跟着逻辑走)
  3. 没有理解清楚每个变量的含义和之间的关系
  4. 没有仔细检查
    这种错误检查的时候也很难看出来,就算看出来了也很难检查全。
  5. 一些变量设成了全局变量,导致错用一个不在分函数里的变量也没有RE,最终导致了WA/RE/TLE
  6. 变量重复使用

分函数错误

1.传值/址错误

最近写搜索题时新发现的一个问题,数组传值进函数需要用结构体,否则直接f(int res[][])会传址,(即使是另一个函数的局部变量也会改变)

2.没有return

int,long long类函数没有return!不会RE但是会WA


初始化错误

多组数据时没有清空上一轮数据或没有优化清空方式导致TLE


判断错误/算法错误/理解错误

  1. 多层if/else一定要多打大括号!
  2. 斜率优化中的平行于y轴的直线一定要判断是inf还是-inf
  3. 分治递归时原本是:
	for(i=0;i<ca;++i) reb[L+i]=fz[i];
	for(i=0;i<cb;++i) reb[L+ca+i]=fy[i];
	sol(l,mid-1,L,L+ca-1);sol(mid+1,r,L+ca,L+ca+cb-1);

错写成了

  if(ca){
		for(i=0;i<ca;++i) reb[L+i]=fz[i];
		sol(l,mid-1,L,L+ca-1);
	}
	if(cb){
		for(i=0;i<cb;++i) reb[L+ca+i]=fy[i];
		sol(mid+1,r,L+ca,L+ca+cb-1);
	} 

然而在sol(l,mid-1,L,L+ca-1);之后 f y fy fy数组已经改变了!!!


知识点错误

  1. 网络流前向星连边记得初始化 t o t = 1 tot=1 tot=1,这样反边才是   x o r   1 \ xor\ 1  xor 1

注意事项

  1. 一定要先手玩样例无误后再开码
  2. 一定要对拍!
  3. 最后15/10/5分钟不要着急写新的代码,要检查文件名输入输出
  4. 检查的时候顺便在文件里( . i n , . o u t .in,.out .in,.out)输出输出看一下
  5. 为防止 R E RE RE,构造满数据跑一跑
  6. const数组常量最多开两个
  7. 输出所有的数组的sizeof()注意不要MLE
  8. 检查题目中给的数据范围和对应的数组大小
  9. 不同变量取名尽量有区别性(避免惯性使用错误)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Set 是一个抽象数据类型,其中所有元素为正整数。集合的基本运算包括: (1)由整数数组 a[..n-1] 创建一个集合。 (2)输出一个集合的所有元素。 (3)判断一个元素是否在一个集合中。 (4)求两个集合的并集。 (5)求两个集合的差集。 (6)求两个集合的交集。 为了实现这些基本运算,我们可以设计一个顺序存储结构。具体实现如下: 1. 定义一个结构体 Set,其中包含一个整型数组 data 和一个整型变量 size,分别表示集合中的元素和元素个数。 2. 定义一个函数 createSet,用于创建一个集合。该函数的参数为一个整型数组 a 和数组长度 n,返回一个 Set 结构体。 3. 定义一个函数 printSet,用于输出一个集合的所有元素。该函数的参数为一个 Set 结构体,无返回值。 4. 定义一个函数 isElementInSet,用于判断一个元素是否在一个集合中。该函数的参数为一个 Set 结构体和一个整型变量 x,返回一个布尔值。 5. 定义一个函数 unionSet,用于求两个集合的并集。该函数的参数为两个 Set 结构体,返回一个 Set 结构体。 6. 定义一个函数 differenceSet,用于求两个集合的差集。该函数的参数为两个 Set 结构体,返回一个 Set 结构体。 7. 定义一个函数 intersectionSet,用于求两个集合的交集。该函数的参数为两个 Set 结构体,返回一个 Set 结构体。 具体实现细节请见代码: // Set.h #ifndef SET_H #define SET_H typedef struct Set { int data[100]; int size; } Set; Set createSet(int a[], int n); void printSet(Set s); int isElementInSet(Set s, int x); Set unionSet(Set s1, Set s2); Set differenceSet(Set s1, Set s2); Set intersectionSet(Set s1, Set s2); #endif // Set.c #include "Set.h" #include <stdio.h> Set createSet(int a[], int n) { Set s; s.size = ; for (int i = ; i < n; i++) { int j; for (j = ; j < s.size; j++) { if (s.data[j] == a[i]) { break; } } if (j == s.size) { s.data[s.size++] = a[i]; } } return s; } void printSet(Set s) { printf("{ "); for (int i = ; i < s.size; i++) { printf("%d ", s.data[i]); } printf("}\n"); } int isElementInSet(Set s, int x) { for (int i = ; i < s.size; i++) { if (s.data[i] == x) { return 1; } } return ; } Set unionSet(Set s1, Set s2) { Set s; s.size = ; for (int i = ; i < s1.size; i++) { s.data[s.size++] = s1.data[i]; } for (int i = ; i < s2.size; i++) { if (!isElementInSet(s1, s2.data[i])) { s.data[s.size++] = s2.data[i]; } } return s; } Set differenceSet(Set s1, Set s2) { Set s; s.size = ; for (int i = ; i < s1.size; i++) { if (!isElementInSet(s2, s1.data[i])) { s.data[s.size++] = s1.data[i]; } } return s; } Set intersectionSet(Set s1, Set s2) { Set s; s.size = ; for (int i = ; i < s1.size; i++) { if (isElementInSet(s2, s1.data[i])) { s.data[s.size++] = s1.data[i]; } } return s; } 在使用时,可以按照以下方式调用函数: int a[] = {1, 2, 3, 4, 5}; Set s1 = createSet(a, 5); printSet(s1); // 输出 { 1 2 3 4 5 } Set s2 = createSet(a + 2, 3); printSet(s2); // 输出 { 3 4 5 } printf("%d\n", isElementInSet(s1, 3)); // 输出 1 printf("%d\n", isElementInSet(s1, 6)); // 输出 Set s3 = unionSet(s1, s2); printSet(s3); // 输出 { 1 2 3 4 5 } Set s4 = differenceSet(s1, s2); printSet(s4); // 输出 { 1 2 } Set s5 = intersectionSet(s1, s2); printSet(s5); // 输出 { 3 4 5 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值