ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

C++小白常犯的错误,这些坑你踩过吗?

C++小白常犯的错误,这些坑你踩过吗? C这个语言相信很多人都学过但学过它又比过赛的程序员们因该都知道它老坑了。我就吃过许多今天我就给大家讲讲关于C的程序员们经常犯的几种错误。一、表面数据小测试点的数据却很大。这是比较经典的比如这道题样例输入16 3样例输出15这个题目简单的不能再简单了我直接毫不犹豫的打出了代码#includebits/stdc.h using namespace std; int main(){ int c,a; cinca; c/2; if(c0) return 0; cout(c-a)*a; return 0; }但是提交后只会有60分问题就出在这。思路没有错错就错在数据范围当大家看到 c 5*10^5,会觉得这不用开long long,但是出题人就是这么恶心表面上数据范围不大其实测试点的数据老大了。正确答案#includebits/stdc.h using namespace std; int main(){ long long c,a; cinca; c/2; if(c0) return 0; cout(c-a)*a; return 0; }所以种题目最好开 long long ,因为有些比赛是OI制的你又不知道得分所以最好开个 long long 以防万一。二、暴力枚举不一定出奇迹。在比赛中许多人比较喜欢直接暴力。因为有过这样一句老话“骗分过样例暴力出奇迹。”但是就是有出题人不按套路出牌我有做过这样一道题输入样例3输出样例:2这道题一般都直接暴力的把每个门做相反处理都遍历一遍。代码如下#includebits/stdc.h using namespace std; bool a[1000000]; int main(){ int n; cinn; int sum0; for(int i1;in;i){ for(int j1;jn;j){ if(j%i0){ if(a[j]1){ a[j]0; }else{ a[j]1; } } } } for(int i1;in;i){ if(a[i]0){ sum; } } coutsum; return 0; }这是最直接的做法但是看看数据范围会发现会超出时间限制那么肯定存在规律。我们把1~25的数据都输出出来。如下1 0 2 1 3 2 4 2 5 3 6 4 7 5 8 6 9 6 10 7 11 8 12 9 13 10 14 11 15 12 16 12 17 13 18 14 19 15 20 16 21 17 22 18 23 19 24 20 25 20我们会发现到4、9、16时都会重复一次剩下的都依次加一。而4~9的差为59~16的差为716~25的差为9......那么可以得出一下代码#includebits/stdc.h using namespace std; int main() { long long n; cinn; if(n1){ cout0; return 0; } long long j3,num1,t5; for(long long i1;in;){ ij; if(in) break; num; j2; } coutn-num; return 0; }这样就满足了题目需求如果按之前的代码看顶多40分遇到数据大时先考虑优化再考虑其他最优解。三、题目的表面看上去有写些复杂其实很简单。看到题目就知道用循环找出K*M的最大值但时会超出时间限制但这种题目一般都可以找出其中的公式如果n为奇数则(n/21)*(n/2)如果n为偶数则(n/21)*(n/2-1)所以代码如下#includebits/stdc.h using namespace std; int main(){ long long n; cinn; if(n%20){ cout(n/21)*(n/2-1); }else{ cout(n/21)*(n/2); } return 0; }所以不要想太多因为有些题目有公式和规律但也要根据题目要求来做。四、开数组得规矩很多时候你的代码是对的甚至是最优解但还是错了。所以有很多人都不知道错哪了。里面有很大的肯能是你的数组开太大了或开太小了。比如有一道题的数据范围为0n10^7,但你只开了10^6那么也会错如果你只开了10^5,那也会错。不信的话去找几题试试但有时开大开小一点点没关系。所以开数组也得按题目要求。以上就是这篇文章的所有内容如有错误或错别字或有更多的想法或自己遇到错误可以发在评论区里我会火速更新下一篇文章题目大概为C程序员常犯的错误这些坑你踩过吗二感谢各位大佬的支持
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进