怎样创建网站直播接口,郴州新网招聘网最新招聘信息,深圳保障性住房可以买卖吗,深圳多区最新通知少打头文件 少打using namespace std; 命名冲突#xff0c;全局变量与局部变量命名一致#xff0c;导致使用的值不是期望值 边读边写#xff0c;导致改后读#xff0c;覆盖写入的值 长整数移位溢出#xff0c;163是错误的#xff0c;应该写成1ll63 循环变…少打头文件 少打using namespace std; 命名冲突全局变量与局部变量命名一致导致使用的值不是期望值 边读边写导致改后读覆盖写入的值 长整数移位溢出163是错误的应该写成1ll63 循环变量打错i打成j 犯错次数加一 乘法溢出导致的数组下标正溢出或负溢出 dfs时开头没有vis[start]1; bfs时状态维数开少 bfs时少写了vis[node]1或者少写了Q.pop导致的MLE 解同余方程时不先约去GCD的话解的距离就是a/GCD或b/GCD,先约了的话那么需要原方程的值的时候就需要带入a,而不是已经改变的a/GCD 做exgcd的题目一定要小心ans%mod0的情况 N-ans/y1 如果ans0,则1不应该加 公式不能只考虑第一个元素其他元素也要全部列出来 单调队列总是忘了取元素直接把队列中的下标拿出来用 vector的resize不会释放内存之前的值都还在... 二重循环里容易把写成 INF值不够大 char数组放了过大的值 char数组结尾不是\0 当要改变一系列声明变量的类型时。。。如果不小心在回车换行时把大数据类型改成了小数据类型则会发生溢出。或者ub 比如int--bool 结果不断加一他还是一 然后就是下标i,j容易弄混在内循环容易仍然使用i或者使用常量 然后平常容易逻辑写反比如while(a!NULLb!NULL)和while(!a!b)这两个看起来很像但是逻辑上是相反的 然后就是编程范式。。。也叫循环不变式这个一定要想好是最前面初始化推最后还是先计算最后考虑结尾 数组名称写错传的参数一直不变或者临时参数一直没有还原 不能整除导致的加一和(int)(divison expr0.5)是不一样的。。。。 还有一道雪崩的大数题目:http://www.cnblogs.com/linkzijun/p/6106697.html https://www.jisuanke.com/article/po3pm3e6 下面调试程序的技巧转自计蒜客 作者介绍计蒜客研发工程师毕业于西南科技大学曾获 ACM/ICPC 亚洲区预赛金奖。 代码能力是我们在程序设计竞赛中常常谈到的一种能力是指选手把算法用代码准确地实现的能力。 2005 年Comars 曾经给代码能力作过一个比较准确的定义如果我 150150 行以内的题目1Y提交一次就正确通过Y 是指 Yes率非常高并且保持稳定而当代码长度超过 150150 行以后1Y 率就开始急速下降了。如果我们画出一条代码行数与 1Y 率之间的关系的曲线150150 行就是一个转折点。我们不妨认为150150 行就是 Comars 当时的代码能力。一年以后经过努力Comars 把代码能力提高到了 250250 行也就意味着他通常可以无错误地写出一份 250250 行的代码。 当然想要把代码能力提高到 150150 行并非是一个简单的事情。在代码能力不够强的时候就需要有足够的调试debug能力了。结合我的比赛经历和平时训练的经验给大家分享一些程序设计竞赛题目 debug 的技巧。 在开始 debug 之前要先在脑海中过一遍思路必须保证自己有一个清晰的算法思路和一个正确的算法至少自己要相信它是正确的。一定要有清晰的思路不然写出来的代码可能连自己都看不懂而基于一个错误算法的 debug 是毫无意义的。当你确认了上面两件事情以后才有必要开始 debug。 1) 顺着你的思路仔细阅读自己的代码两到三遍注意是仔细要一句一句地读。核对你的代码和你的思路是否一致不要放过任何一个小细节。如果遇到拿不准的地方立刻停下来仔细想想直到想清楚以后再继续。在这个过程中往往可以找到很多低级错误尤其是对于代码能力不太好的同学比如——变量打错、代码写错位置、变量赋值错误等等。静态阅读代码的效率是非常高的因为往往读一份自己写出的代码的时间远小于写的时间——既然都已经花了那么多时间写出来了何必还在乎这点时间多读几遍呢。 2) 如果经过上面的过程还没有找到程序中的错误或者找到了一些问题但是程序的结果还是不对这时我们就要通过运行程序来 debug。根据我以往参加竞赛的经验经过上面的过程基本上可以解决一半以上的问题。如果一定要走到这一步很可能已经给自己挖了一个巨大的坑。想要通过运行程序来 debug第一步是需要拿到一组能使得程序出错的数据拿到错误数据以后debug 就成功了一半。在造错误数据时一定要静下心来耐心出不要指望一下就能造出错误数据。并且造出的数据尽量不要规模太小、太简单数据越复杂找到错误的概率会越高。对于 ACM/ICPC 这种团队比赛必要的时候你可以让队友帮你造数据。例如某年 ACM/ICPC 沈阳赛区我当时调试一道模拟题半个多小时还是错的距离比赛结束还有 1010 分钟时队友找到一组错误数据然后我调了 55 分钟就找出了那个致命的 bug。在比赛进行到 295295 分钟比赛一共 300300 分钟的时候正确通过了这题很关键的一题。同年上海赛区也是最后几分钟队友给出一组给力数据在 299299 分钟绝杀一道 dp 题目。有了数据以后剩下的调试应该很简单了。根据错误数据输出一些重要的中间变量的值然后观察是否和预期一样。这里也可以借助二分思想输出中间变量快速定位到错误代码块。不过实践中通常是根据经验觉得哪块容易出错就重点输出哪一块的变量。无论是平时训练还是比赛中我都建议少用 IDE 断点调试功能和单步调试功能通常比较浪费时间。 3) 对于某些特殊题目小数据可以很容易写出一个时间效率低但确保正确的“暴力”程序。这时候我们可以用暴力程序和出错程序对拍。对于造出的一些小数据同时用自己的程序和暴力程序得出答案然后对比。这个小数据的范围是暴力程序能在短时间内得到正确结果的最大范围。因为暴力程序一般都很简单没那么容易写错所以你通常把暴力程序当成小数据的标准程序。如果连暴力都写错建议多做练习提高代码能力确保短代码都能尽量做到零失误。 经过上面的 debug 过程以后如果你手造的复杂数据多达 1010 组以上还没有发现错误。你可以尝试下面的做法 重新思考一个新思路或者尝试去发现原思路中的问题。 先静下心来先看看其他题AC 一些其他题调整一下状态然后回来重新 debug。 如果你确定思路一定没问题代码也一定没错那通常是因为你读错题目了重新回去读题。 如果到这一步你的程序还是无法正确通过并且你确保没读错题只要有足够的自信联系出题人和他确认数据是否有问题。 debug 过程中不要轻易请教别人请教别人思路没问题但是请教别人帮你 debug 不太好。除非你已经连续 debug 了一天还没有发现错误再考虑去请教其他人。这里教大家一个 debug 技巧——断言assert。 1 assert(x 0); 如果x 0不成立则程序会因为运行错误而退出。比如写一个整数除法函数 1 int division(int x, int y) { 2 assert(y ! 0); 3 return x / y; 4 } 如果y 0程序就会异常退出你一定是在程序的其他什么地方写错了。 再如solve(x, y)如果应该等于solve(y, x)我们可以assert(solve(x, y) solve(y, x))如果运行错误那么必然solve写错了。在解决 Polya 计数题目的时候可以assert(sum % |G| 0)。除了用来调试以外assert还可以用来验证数据是否规范对出题人很方便还可以用来验证 OJ 数据的准确性。 经验之谈 最后列出一些比赛和训练中特别容易犯的一些低级错误和治疗方法 错误代码 1 int n; 2 int a[n]; 治疗方法初学者很容易写出这样的代码当然老队员肯定写不出这种代码的。尽量避免这种写法定义数组用常量比题目约定的数据范围稍微大一点。比如数据范围是 1 \leq n \leq 100001≤n≤10000则开一个 10000 101000010 的数组会比较稳妥因为你也许后来心血来潮让下标从 11 开始计数。 1 const int maxn 10000 10; 2 int a[maxn]; 错误代码 1 for (int i 0; i n; i) { 2 if (i n) { 3 printf(%d\n, i); 4 } 5 else { 6 printf(%d , i); 7 } 8 } 治疗方法剁手。编译警告warning会提醒的不要忽略甚至直接关闭编译警告。建议在做题的时候把编译选项-Wall打开 1 g -Wall -o main main.cpp 错误代码 1 double a 1 / 3 * 3; 2 double b 1; 3 if (a b) { 4 printf(Yes); 5 } 治疗方法判断浮点数相等应该用极小值eps来辅助一般eps取1e-8足够了确保比题目约定的精度误差要求更小。 1 const double eps 1e-8; 2 double a 1 / 3 * 3; 3 double b 1; 4 if (fabs(a - b) eps) { 5 printf(Yes); 6 } 错误代码 1 const int inf 0x7fffffff; 2 int dp[10]; 3 int main() { 4 for (int i 0; i 10; i) { 5 dp[i] inf; 6 } 7 for (int i 1; i 10; i) { 8 dp[i] min(dp[i], dp[i] dp[i - 1]); 9 } 10 return 0; 11 } 治疗方法这里inf inf会溢出超出了int的范围。可以把inf的定义改成const int inf 0x3fffffff就可以确保不会溢出了。顺便给大家推荐一个小技巧 1 int dist[100]; 2 memset(dist, 0x3f, sizeof(dist)); 如上的代码可以让dist数组中的所有元素赋值为0x3f3f3f3f并且两个初始值相加也不会溢出常用于图论或动态规划中数组的初始化。 错误代码 1 // 1. 线段树 build 2 void build(int id, int l, int r) { 3 if (l r) { 4 return; 5 } 6 int mid (l r) 1; 7 build(id 1, l, mid); 8 build(id 1 1, mid 1, r); 9 } 10 // 2. 取 dp 答案 11 printf(%d\n, dp[1 n - 1]); 治疗方法没有弄清楚操作符优先级。在优先级不确定的情况下用小括号来明确指定优先级能够避免这类问题的发生。当然最好还是要弄清这些符号之间优先级的关系。 1 // 1. 线段树 build 2 void build(int id, int l, int r) { 3 if (l r) { 4 return; 5 } 6 int mid (l r) 1; 7 build(id 1, l, mid); 8 build(id 1 | 1, mid 1, r); 9 } 10 // 2. 取 dp 答案 11 printf(%d\n, dp[(1 n) - 1]); 错误代码 1 #define MAXN 1000 10 2 #define MULTIPLY(x, y) x * y 3 int a[MAXN * 4]; 4 int main() { 5 int x MULTIPLY(1 2, 3); 6 return 0; 7 } 治疗方法尽量不要用宏定义常量用const来定义。宏定义虽然很方便但是用起来很容易出错比如上面这段代码。如果你一定要用宏定义先去了解宏定义常见的“坑”再用。 错误代码 1 #include iostream 2 using namespace std; 3 bool t, first; 4 5 int main() { 6 first true; 7 cin t; 8 while (t--) { 9 ... 10 } 11 return 0; 12 } 治疗方法写代码的时候不要太“随性”这种情况的发生通常都是写程序时中途加了一个变量导致的只要不太粗心就能避免。由于可能会发生这类错误所以在本地造数据的时候对于多组数据的题目要尽可能在一次测试中多造几组数据以尽量避免此类问题。 在大多数平台和 ACM/ICPC 现场赛时C 的 long long 用%lld输入而对于一些搭建在 Windows 上的 OJ如 Codeforces、HDOJ要用%I64d读入。具体使用哪个占位符要多看 FAQ。 变量在访问前一定要初始化。好的习惯是在定义一个变量的时候就立刻初始化。一定注意很多平台包括计蒜客的题库的编译器是不会在定义数组后将数组内元素全部初始化为 00 的如果你遇到本地和线上结果不一致的情况可以从这个方向来找问题。 避免访问非法内存。访问非法内存的事情经常发生但是可以通过养成好习惯来避免。比如stack、queue、set访问之前必须先确认不为空访问指针之前确保指针不是野指针数组内存开得足够大等等。 转载于:https://www.cnblogs.com/linkzijun/p/6783103.html