2023 西北工业大学 NOJ 程序设计基础(C++) 100道完结版 含额外样例,题意理解,coding思路分析,难度评估
极其感谢TA的帮助,所以下面是,爱门!
2023西工大NOJ (C语言版) 完结!!!-CSDN博客
前言
对于瓜的学生来说,noj是选了实验课之后必做的作业,占20%的分数;
但希望不要为了功利的目的写noj,理由如下:
1.编程永远是实践的过程,真正的知识只有自己打出来才能获得;更别说瓜的教材比较老,和新的C++标准有不少出入,尤其是习题册。
2.实验课也就1学分,不挂就行,你为了这点绩点功利啥。
3.瓜的实验课考试为随机抽题,最后答成什么样子主要看脸,你再功利也没啥用。
对于noj,自2023年秋开始启用新题,可以说,难度大幅提升。但质量存在极大参差,(◎_◎;);
C的NOJ教程有很多,但是C++的这可能还是第一篇,希望对有需要的人能有所帮助;
希望是有参考、引导的作用,帮助同学能更加高效地学习C++;
必看
对于代码
本人初学者,能力有限,有幸获得一位大佬很多帮助;
如若代码粗陋,请谅解;
因为本人水平实在有限,部分代码来自各个大佬,如不希望转载,可以联系我删除;
尽量使用较新的C++17标准,而不是教材和习题册上的包浆标准(食答辩了);
代码当然是尽可能AC的,但是由于noj的评阅比较雾,有的完全正确的也是WA,可以试试其他version,要是都不能我也没办法,饶了我罢;
代码格式
每题的代码,前两行会是 难度,重要性 评估,然后是该程序的一些注意点。
然后会是1+个版本,最后输入输出样例。(多版本时,后续的版本为了可读性不会注释掉,复制的时候注意)
考虑到做题方便,我会给出额外样例,以供同学检验自己的程序。
同时,考虑到中文复制之后会产生字符集问题,所以程序内部注释为纯英文(Chiglish)。
推荐工具
1.建议使用CLion作为编程工具,别惦记那CodeBlocks,Dev-C++了,一个太简陋,一个太老,不具有现代化工具的特点,都4202年啦,大人,时代变啦!
实在不行也得用Visual Studio,community版本免费,官网链接如下
Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com)
你说你只会CodeBlocks?甚至CodeBlocks都配置不明白?能不能有点学习意识,
B站上手把手教你安装配置Clion,Visual Studio的视频一抓一大把,学不会就洗洗睡吧。
你说Visual Studio下载太慢?我滴IDM可是一眨眼就下好了,你也可以试试梯子。
至于最推荐的CLion的安装、配置、使用,我就直接放大佬的文章了
CLion安装、配置、使用、调试(完全小白向)-CSDN博客
2.不会吧,不会吧,不会有人写noj是网页看一眼,切个界面再打一句代码吧,或者是每次一忘就要切回头看一眼,烦不烦呐。
什么,你说你是小机灵鬼,直接分屏,可是如果你不是外接显示器,那么点大的屏幕还分屏,折磨自己捏。
所以,在下隆重推荐Snipatse,可以直接把noj上面的题目截下来,悬浮显示在最上层,而且还可以白嫖!
官网链接Snipaste - 截图 + 贴图,不过建议直接在微软商店下载,体验更友好。至于使用方法,当然是自己去B站大学自学啦。
注:上述建议均基于Windows电脑,MacOS我真不道啊。
建议
1.学C++,就不要觉得自己只学C++,C的很多操作也得会。很多人C++学到最后,scanf()和printf()都不会。
NOJ攻略
1.写noj必须具有的意识:考虑极端情况,题目肯定是尽可能的恶心(划掉),考验你啦.
2.noj提交后的各种状态:
pending :处理中,重新刷新或者重新点击NOJ作业有概率得到结果;
如果一直pending,大概率是noj服务器又崩了罢(不是你的锅);
等服务器好了之后,可以在提交的程序上打一个空行再提交。
AC :你醒啦,恭喜你,你已经是个女孩子了(幻视,划掉);恭喜你,这道题通过了。
WA :程序错误,不能在输入后台样例的情况下得到正确结果。
TE :超时,也就是你的程序运行时间太长;
noj有的题目对时间卡的很紧,出现这种情况说明你又没动脑子 : (
解决方法很简单,抛弃你的暴力算法,用好的算法好好优化一下你的程序。
(注:对于noj来说,有的时候你的程序其实是TE,却给你显示WA,别给我犟,叉腰.jpg)
CE :编译错误。
如果你想:我本地运行的好好的,为什么提交上去就CE呢,不是可以编译吗?
一般有两种原因:
1.头文件写漏了,本地没毛病是因为正常编译器会给你自动添加部分头
文件,而noj的编译器就像薛定谔的猫,没人知道jxf到底塞的什么。
(经典用cpp的string类不加,加)
2.孔乙己,你是不是又用了什么STL特性?
什么?你说C++如果不用STL,和C有什么区别?
可是我们noj的编译器似乎不能完全支持STL捏(有时这种情况报WA)
3.代码输出:
有人发现,很多一次输入很多组数据的题目,我提供的代码不能输出对应的样例,凭什么说能AC?
这和noj后台的评阅机制有关,你别管了,长篇大论懒得扯,反正能,就是能;(叉腰.jpg)
(实际上很多程序你直接复制粘贴我给的Input,然后敲个回车,输出会有问题,但是你自己一个数据一个数据地敲,或者分行粘贴,每行回车就好了);
良好的编程习惯
下面是我的编程习惯(我是菜鸡,大佬轻点骂)
第一部分:预处理命令,#include,#define等
空一行
第二部分: using namespace std;
空一行
第三部分:各类函数,彼此空行
空一行
第四部分:主函数 int main()
下面是示例
合理的空行和缩进不仅美观,还可以有效提升程序可读性!
#include using namespace std; void fun(){ } int main() { return 0;//new C++ standard can ignore this }
夹带私货
关于电脑相关的外设,建议整一个机械键盘(一定要有素质,买线性静音轴,比如水蜜桃V2);
更重要的是,整个无线鼠标,尤其是带两个侧键的,比如罗技G304,一个侧键定义Ctrl+C,一个定义Ctrl+V,这会极大提升你的编程体验!
如果想买一个外接显示器的话(可以显著提升电脑使用体验),建议买23.8寸左右的,27寸你瓜宿舍桌面真塞的下,但是太大了,观感很不好。最重要的是分辨率至少2k,刷新率75hz就够用,色准要好,基础HDR要有,要是支持Type-C一线连接就更好啦。(我滴SANC N50PLUS 3代完美符合捏)在这之后就可以买个侧立支架把笔记本合上了,(如果你不是很追求双屏体验,双屏瓜的桌子也不怎么塞得下吧)。(十分建议显示器在京东上买)
对了,显示器最好搭配支架使用,NB f80就挺好的,便宜好用质量好。(为了应对挡板,可以搭配某宝定制小实木木块使用)
免责声明:看了私货部分,决定要买什么是自己的事,自己的决定,在下的话只是建议,仅供参考,不负责任,请自己思考判断自己是否需要,以及是否自愿承担相应风险。
声明
note只会在前几季有,用于引导新手,才不是因为懒呢;
但是放心,后面的难题,或者复杂的题一般都会带注释,甚至可能中文注释;
后期会逐渐添加题目截图,有的可能不含Sample Input和Sample Output部分,但是代码最后肯定有;
如果Additional Input和Additional Output 是NULL,说明这题没必要搞额外样例,或者是太麻烦,我已经懒死了;(要是实在想要额外样例,拿我的代码随便跑几个不就行了)
有的题目,我说无人AC,是基于我的认知,可能有真的大佬,可能题目又被修改过了,反正是我这个小垃圾肯定AC不了酱紫;
严正声明:该篇Blog仅作引导作用,绝不鼓励抄袭,若因其他用途产生不良后果与本人无关。
总结
2023年秋-2024年春的C++ noj 一共100道,应该是最多AC97道的亚子;
其中 042.【专业融合:航空】飞机起飞速度
057.字符串替换
074.【专业融合:天文】日出日落时间
三道不能AC;
第1季(001-010)
001.Hello World
//Difficulty: 0/10 //Importance:10/10 //The place our dream begin! //What you need: //a good coding style(tab,enter,naming...) //clear coding logics #include using namespace std; int main() { cout > B ; couth3 id="003.%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%A4%A7%E5%B0%8F%E5%8F%8A%E8%8C%83%E5%9B%B4"003.数据类型大小及范围/h3 pnote:/p p1.sizeof()函数的学习;/p p2.climits的基本运用。/p pre class="brush:python;toolbar:false"//Difficulty: 1/10 //Importance: 1/10 //make use of climits (limits.h) to get min and max sizes //sizeof(),return memory size(bit) #include iostream #include climits using namespace std; int main() { int n; cin >> n; switch (n) { case 1: cout >fz1; getchar(); cin>>fm1; cin>>fz2; getchar(); cin>>fm2; int arr[4][2]; add(fz1,fm1,fz2,fm2,arr); sub(fz1,fm1,fz2,fm2,arr); multi(fz1,fm1,fz2,fm2,arr); divi(fz1,fm1,fz2,fm2,arr); char symbol[4]={'+','-','*','/'}; for(int i=0;i