九度oj分类汇总

模拟类型

这类题常考,看似不难,但是对于初学者来说,用代码完整地写出题意描述中的意思还是需要多加练习

1000

1001

1020

1031

1036

1038(这题请认真读题)

1013

1014

1045

1046

1048

1050

1059

1060

1062

1063

1064

1065

1067(这个题目可以练习最简单的递归,虽然人家不让用递归)

1068(double比float的好处,可以按两种类型分别提交,看结果便知道)
1070

1075(注意细节)

1177

1179

1183

1186

字符串处理

字符串处理对于实验室做项目来说再常见不过了,因此出题往往也会偏向这部分,应该熟练掌握

1003

1006(认真读题)

1010

1013

1019

1021

1203(这个题可用灵活的IO代替字符串你想到了吗?)

1032

1049

1055

1058

1059

1182

1192

1199

1206

1334

字符串里面的常用的简单技术有 查找 替换 字符串转换为数字 要熟练(使用库函数或者自己手写都要熟练)

数学问题:

质数的判断:

1040

1047

1207(略难可不做)

筛素数法不会请百度

公约数公倍数:

1056

1336

辗转相除法

矩阵的一些问题:

1180

1173

1191

1193

进制转换

1026

1194

今年就考了,基础但是常见啊!

高精度计算

注意题目描述,注意前导零后续零:

1198

1137

用计算机语言模拟一些数学解题的方法还是有难度的

数组的问题:

对数组的操作,简单但是很基础

1004

1018

1039

1052

1053

1057

1066

1174

1334

1363

1375

1398

栈的练习:

1019

1342

队列的练习:

1415

排序的练习:

简单的排序问题:

1014

1034

1041

1178

1185

1202

冒泡也好什么也罢但是请一定会手写快排

归并排序:

1004

堆排序:

1416

其实不是排序题,但是要用到堆的思想请体会TLE的原因

二叉排序:

1009

1201

字符串排序:

1054

1066

1178(先后顺序决定了一些问题请体会)

1190

1195

1419

多级排序

多个关键字,学会stl的sort,并为其编写判定函数

1023

1061

1187

1196

1339

1346

链表、指针的问题:

1181

1788

1789

(后两个题不用指针的话可以用什么做你想到了吗?)

树的练习

加油吧就要胜利了

二叉树建树、遍历:

1184

二叉树概念的考察:

1176

二叉排序树的建树遍历:

1009

1201

霍夫曼树

不建树求权值你想到怎么做了吗

1416

1172

这个略微高端但都是数据结构的的东西建议做做

图的概念问题:

1027(请体会)

最短路径问题

请回忆地杰斯特拉和弗洛伊德

Djs:

1008

1341

1406

1411

Fly:

1343

这个不是经典的弗洛伊德,但可以用弗洛伊德的思想,djs也可以做请体会

并查集的题

不懂并查集请百度

1012(很典型的)

最小生成树:

并查集+克鲁斯卡尔

1017

1024

1028

1347

1417(字符串简历索引表)

并查集用数组做的时候上述题目有的可能会超时,请反思自己的并查集可否优化(提示:还是用数组,仅仅加一行即可)

图的搜索:

这类可以忽略 真的可以忽略 (我觉得吧有时间还是看看–)

宽搜:

1335

1365

1404
(后两题可以不做)

深搜:

1012(可以用深搜但是感觉还是并查集好些,建议都练练)

简单递归:

1067

1073

1408

1205(非递归也要会)

简单的递归和递推的区别在哪?

以斐波那契数列为例 1 1 2 3 5 8  a[n]=a[n-1]+a[n-2]  
递归:由未知开始找一个到达已知的道路然后返回解不断迭代a[n]=a[n-1]+a[n-2] 
直到 a[3]=a[2]+a[1]=1+1=2  
递推:直接用已知求未知,先求a[3],再求a[4]直到求到所需的a[n]为止。

简单递归总是超时怎么办 ?

1检查边界情况是否都考虑进去,公式是否正确;  
2优化 用一个数组保存已经算过的值,递归的时候会有大量的重复计算,
如果加入判断条件 当这个状态计算过之后就直接返回值,会节省很多时间。
(略抽象,请仔细体会,不懂也没事)  

简单的DP(动态规划) 可以完全不做,没多少人能做出来的 放心吧!
(有时间还是看看–)

序列问题:

基础:

1011

1077

1112

1123(1077的升级版真的不难)

背包问题:

0-1背包:

1364

1420

1123

1152

1209

1358(为什么1358也是背包?请仔细思考,当然我不排除有其他解法)

完全背包:

1072

1395

完全背包和0-1背包求解的区别?

0-1背包从n到a[ i ]开始扫 完全背包从a[i]开始扫到n,
至于为什么,如果你有能力做完上面的题,那么你肯定就懂了,如果做不明白果断不做了,
没关系考察这部分的概率很小的。  

不是经验的经验:

首先,拿到题,不要急于上机,首先请认真读题,不行就在纸上比划比划,
大概用什么数据结构,数组要开多大,有多少变量,用什么算法要首先想明白,
此外,对于数据的规模要有一个概念(10000以上的规模貌似就不能用n*n的算法了),
数据的边界值,特殊值需要不需要特殊处理,太乱了就写在纸上吧。
慌乱之中编出的程序有很多的逻辑漏洞,
debug起来很费力,所以编码前一定保持冷静和清醒。  
第二,注意变量的名字和初始化的值。
变量名字是为了让你的代码有比较好的阅读性,自己记忆起来比较方便。
变量的初值直接与你的程序能否正确运行有关系,在变量初始化的时候,
请注意你的标记是否跟数据的边界值重合。  
其次,关于代码的缩进和模块化。据说老师是会拿到上机的代码的,
因此请注意你的缩进格式和模块。但是这样做的目的不仅仅是为了取悦你的老师,
在自己debug的时候也会十分的方便。利人利己。  
再次,说点debug的事情,
有人问devcpp不能调试什么的巴拉巴拉的。其实在调试的时候,可以将自己的中间变量输出,
如果你的代码符合我说的上一点,那问题出在哪就会十分的明了。
切忌提交的时候要把这部分加上注释或者直接去掉,不然就纠结了。  
最后,如果你决定做一道题,就一定要将它ac,
任何什么“我会了”,“我知道怎么做就行了”都没有ac了来的实在。  

附赠一些我经常犯的错误:

re: 数组是不是少了一位 下标越界情况是否排除?(比如a[-1])  
pe: 空格是不是少了多了?  
Wa: 数据是多组还是一组 大小写 空格问题  
OLE:是否忘记了scanf()==xx  测试的//是不是没有加上  
TLE:是否忘记了scanf()==xx   
=与==的区别  
输入的时候&别忘了!!!  
for()是否多加了; eg: for();  
memset(a,0,sizeof(0)) (自己看看这是哪不对,给数组清零)  
图的自环 重边问题  
是不是有遗忘了的数组未初始化  
数据定义的类型

代码中可能出现的术语详解

Accepted (AC) :

OK! Your program is correct!

Presentation Error (PE) :

Output Format Error. 
Your output format is not exactly the same as the judge's output, 
although your answer to the problem is correct. Check your output for spaces 
blank lines, etc. against the problem output specification.

Wrong Answer (WA) :

Correct solution not reached for the inputs. 
The inputs and outputs that we use to test the programs are not public. 
Some problems with special judge may not reply "Presentation Error",
replaced by "Wrong Answer".

Runtime Error (RE) :

Your program failed during the execution 
(segmentation fault, floating point exception...). 
The exact cause is reported except Java.

Time Limit Exceeded (TLE) :

Your program tried to run with too much CPU time.

Memory Limit Exceeded (MLE) :

Your program tried to use more memory than the judge default settings.

Output Limit Exceeded (OLE):

Your program tried to write too much. 
This usually occurs if it goes into an infinite loop. 
The output limit is usually 256K, 512K, or 1M bytes.

Compilation Error (CE) :

The compiler (gcc/g++/gpc/fpc/javac) could not compile your program. 
Of course, warning messages are not error messages. 
Click the link at the judge reply to see the actual error message.

Restricted Function (RF):

Your program tried to call restricted functions. 
For example, maybe you have tried to open a file which is forbidden on OJ. 
It may also caused by Runtime Error 
(e.g. maybe a pointer point to wrong funtion), 
just consider it as Runtime Error in this situation.

Internal Error (IE):

The Judge system cause an internal error, please submit it later.

看见英文想吐就看我

还是练习练习吧,你知道六级给你查分的时候,我多紧张吗?

但是做题已经很不容易了,帮你一次吧。

AC

没毛病

PE

输出格式错了,是不是空格多了少了

WA

答案不对,是不是数据考虑不全面,多了少了,空格,大小写

RE

运行的时候错了,是不是数组越界了?还是少了一位啊

TLE

CPU超算了,最外重是否忘记了scanf()==xx

MLE

占了太多内存了

OLE

写太多了?是否忘记了scanf()==xx  测试的//是不是没有加上 

CE

不能编译,是警告,点链接能看到原因

RF

调用受限函数?

IE

网络问题,稍后提交?

做题流程总结

所以我总结了一下对于刚接触九度OJ的同学算是一个入门的小教程。
如果以前接触过acm的同学可以不用看了。

1.网址:ac.jobdu.com

2.如果以前是王道论坛的用户,直接输入那个账号和密码就行。
  如果不是的话,可以在首页新注册一个。

3.做题:在首页上方第二栏“在线练习”中点击“题库”,题目列表就出来了。
4.题目的大体框架:
(1)题目描述:会有一些小故事,或者要求你完成的任务。
(2)输入:对于输入数据的格式及范围的描述。
(3)输出:对于输出数据的格式及范围的描述。
(4)样例输入:给出一个输入数据的例子。
(5)样例输出:给出一个输出数据的例子,
自己写完程序后可以拿“样例输入”中的例子测试一下自己的程序,看输出跟“样例输出”的结果是否一样
一样的话就可以提交程序了。如果不一样,需要改程序直到一样。
(6)提示:一般有一些需要注意的地方这里会说出来。

5.程序的大体框架:
拿1000:计算a+b举个例子,
(1)一般常用到的头文件入下:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>//算法库,有些排序程序会用到
#include<math.h>//一些数学的函数会用到这个库
#include<string.h>//字符串处理的时候会用到
using namespace std;
这些做一般的题目就都够了,有些题目也可以不用把这些头文件全部添加进去,
不过我一般的做法是直接全加进去,反正不花钱,哈哈。
(2)输入的时候需要注意,一般题目都是有多组测试样例,所以需要循环输入。
比如1000这道题目输入a和b的时候,
C++:        while(cin >> a >> b)
        {...}
C:        while(scanf("%d %d", &a, &b) != EOF)
        {...}
然后在大括号里面按照题目要求写程序就可以了。
(3)输出:有的题目的输出有可能不是只让输出数字的答案,
就按照它的要求加上需要输出的一些字符就行,
比如:1046那道题目,printf("max=%d", &ans);就行。
(4)1000:计算a+b的完整代码(以后写题目可以作为参考,基本框架这里就有了)
(对了,主函数main的返回值必须为int,然后在程序中return 0就行。)
C++版本:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;

int main()
{
        int a, b;
        while(cin >> a >> b)
        {
                int ans = a+b;
                cout << ans << endl;
        }

        return 0;
}
C版本:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;

int main()
{
        int a, b;
        while(scanf("%d %d", &a, &b) != EOF)
        {
                int ans = a+b;
                printf("%d\n", ans);
        }

        return 0;
}

6.题目写完后,点“提交就行了”,可以选择语言,在代码框中粘贴上你的代码,
点“submit”就可以提交了。稍等一下刷新一下页面就能出现你的题目的返回结果了,
一般返回结果会有以下几种情况:
(1)Accepted : 程序通过!
(2)Running & Judging: 正在运行和判断.
(3)Compiling : 正在编译.
(4)Presentation Error : 答案基本正确,但是格式不对。
(5)Wrong Answer : 答案不对,仅仅通过样例数据的测试并不一定是正确答案,
一定还有你没想到的地方.
这几个是比较常见的,还有一些返回结果可能以后做题会遇到,到时候再说就行。

本文参考:

http://blog.csdn.net/wdkirchhoff/article/details/41849045

http://www.cskaoyan.com/thread-79419-1-1.html

本分类所有文章均为她复试准备刷题之用,多处借鉴网络博客大神思路代码,如有侵犯,请务必联系本人,做出处注明以及事宜商谈,如有冒昧,多多包涵。