ACM中WA方面的错误总结(五篇模版)

时间:2019-05-12 12:34:09下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《ACM中WA方面的错误总结》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《ACM中WA方面的错误总结》。

第一篇:ACM中WA方面的错误总结

1、Int遇到过的问题 简介:

int是我们最常用的类型之一。如果输入数据是整形,一般都直接用该类型来存放输入数据。

错误经历:

自己在作Equiptment Box时,因为输入数据长、宽均是小于50000的整数,因此就使用int来作输入。这本身没有问题,但在求其斜边长时,使用的是sqrt(x * x + y * y),表面看是没有问题,但结果一直是Wrong Answer。后来将这一行改为pow((pow(x, 2)+ pow(y,3)), 0.5),就Accept了!错误原因:

后来经johnbill和hewei的分析,x,y本身没有问题,不会越界,但使用sqrt(x*x +y*y)时,里面的x*x 和 y*y则会超出int范围,造成溢出。而pow会将参数自动转换为double,就不会出错。

避免失误的办法:

(1)以后均使用pow进行运算。(习惯)(2)运算时,注意做强行转换。(比较麻烦)

(3)不管输入给的类型,直接用double来存储,就不会溢出了。这种方法表面看没有问题,但直到这次比赛,才发现了一个很严重的问题!

2、double遇到过的问题 简介:

是我们在解题时,和int一起是最常用的类型。错误经历:

因为 double上限可达1.7e308。而一般题目(非大数运算要求)均不可能超过其限,发生溢出,所以之后我就在做题时,凡是遇到结果有些大时,均用double类型来保存,来避免溢出。看起来,这样比较方便,因为我们在本机上是用VC++,而OnlineJudge是gcc,它们支持的长整形类型不同,一个是__int64,而一个是long long;处理格式也不同,I 64u 和 lld。而在这种情况下,“真正”的可以用double的话,那就可以将其统一起来。但是……昨天比赛C题时,自己也是这么递推和用double保存,但一直Wrong Answer。和递归能计算出(太大的数据很耗时)的数据相比,都是正确的,不知原因何在。比赛结束后,和别人结果对照了一下,把double改成unsigned long long 就Accept了。错译原因:

这是因为:double类型的精度只有15位!!它的上限可以很大,但只能保证15位的精度!换句话说,只能保证15位是正确的。在数据(50,50)以后,结果都在20位以上,前面的位数是正确的,但后面的几位就会出现问题了!解决方法:

(1)定义头文件,在本机上用__int64,提交时用long long(2)本机上使用VAC编译(J)(奇难用!)

(3)反正绝对不能使用double来计数,尤其比较大的数,但可以利用它来测试最大数据的范围大小,这样可以反过来帮助我们决定用什么类型来保存。

3、float遇到过的问题

我还记得当时Hunter做area的时候,各方面都作了考虑,但一直是Wrong Answer。后来只是把存储坐标的float类型改为double,就过了。原因:

应该是float的精度不够(具体嘛…..大家re),但题目只要求3位小数也有问题……。所以,以后大家要使用浮点数计算时,直接用double,不要考虑使用float。一般内存是不会有问题的。

4、4舍5入的问题:

在做Lifting the Stone时,题上要求保留到小数点两位,第三位作四舍五入,自己直接用%.02来打,以为自动会四舍五入。但一直没过。加上处理之后就过了…….原因:

小数点后第三位为5时,会随机的作进位处理。解决办法:

如果题上要求了四舍五入,一定要记得进行处理:x = floor(x*100 + 0.5)/100,5、为5时,后一位奇数进位,偶数不进位: 这个JohnBIll讲过,一般不会有这种“浪费青春的题…..”。解决办法:

除了相当的灵活,多试,还需要运气了……

第二篇:ACM错误提示

http://acm.nankai.edu.cn/user_message.php

F.A.Q.(Chinese)我的程序为什么不能编译通过呢?

Online Judge 要求C/C++程序符合Ansi标准:

ANSI 标准和 Microsoft Visual C++ 存在一些不同的地方,比如:

0)main函数必须声明为int,也就是 void main()必须变成 int main()

VC同样可使用int main,只是程序最后需要 return 0。

1)Microsoft Visual C++ 可以将 main 函数声明为 void,而 ANSI 中必须为 int main

2)请避免使用如下方式声明变量i

for(int i=0;i<10;i++)

{

...}

您可以在For 语句之前,进行声明。

3)itoa 不是一个 ANSI 函数

4)stricmp 不是一个 ANSI 函数

5)sqrt()的可能用法:sqrt(double(x));//强制转换为double

6)OnlineJudge 中如何使用64位数?

定义64位数使用 long long 类型,输出格式串中使用 %lld 表示64位数。

虽然Free Pascal尽量设计得和Turbo Pascal接近,但是由于以下的两个原因,两者之间还是有一些区别的:

1.Free Pascal是一个32位的编译器,而Turbo Pascal只是16位编译器;

2.Free Pascal是一个跨平台的编译器,而Turbo Pascal只在windows上使用。

如果你的代码是遵守ANSI Pascal的,那么代码从Turbo Pascal移植到Free Pascal是没有问题的。

下面是在Turbo Pascal上可以使用,但是在Free Pascal就不能使用的一些语言特性:

1.函数和过程在使用时,参数的类型必须和定义时完全一致。原因是在Free Pascal中添加了函数重载功能。

2.PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE成为了关键字,因此不能作为函数和过程的名字。

3.FAR,NEAR不再是关键字了。原因是Free Pascal是32位系统,不再需要这些关键字。

4.布尔表达式不一定要全部进行计算。只要最终结果已经能够确定,就不再计算其它还没有计算的部分了。

比如布尔表达式exp1 AND exp2 AND exp3,如果已知exp1的结果是false,那么怎么表达式的结果肯定是false,exp2和exp3就不用进行计算了。

5.在Free Pascal中,集合中的元素都是4个字节长的。

6.表达式执行的顺序是不确定的。比如对于表达式a:=g(2)+f(3);不保证g(2)一定在f(3)之前执行。

7.如果用Rewrite打开文件,那么文件就只能被写入了。如果需要读取这个文件,要对文件执行Reset。

8.Free Pascal在程序结束之前一定要关闭输出文件,否则输出文件可能不能被正确的写入。

9.Free Pascal理论上可以使用4GB的内存,因此实际上几乎可以使用系统中的所有剩余内存(除非赛题中有内存限制)。

这是Free Pascal由于32位的编译器。但是对于Turbo Pascal来说,由于是16位的编译器,因此不能定义大小超过64KB的数据类型和变量,并且在DOS实模式下可以使用的内存总数只有640KB。

Online Judge 评判结果分别表示什么意思?

当你提交的程序被Online Judge评判完毕后,通常结果将立刻返回,或者你也可以在“Solutions”页看到评判结果。

详细测试多数据测试模式下,将显示出各个测试数据的测试结果,并且无论结果如何,都会用所有测试数据进行测试。

而一般多测试模式下,如果全对,则为Accepted;若其中某次数据出错,则评测中止,并返回此数据出错的信息。

常见的Online Judge将评判结果分为如下几类:

Accepted

程序的输出完全满足题意,通过了全部的测试数据的测试。

Wrong Answer

你的程序顺利地运行完毕并正常退出,但是输出的结果却是错误的。

注意:有的题包含多组测试数据,你的程序只要有一组数据是错误的,结果就是WA。

Presentation Error

你的程序输出的答案是正确的,但输出格式不对,比如多写了一些空格、换行。

请注意,大部分程序的输出,都要求最终输出一个换行。

不过,计算机程序是很难准确判断PE错误的,所以,很多PE错误都会被评判成WA。

Compilation Error

你的程序没有通过编译。你可以点击文字上的链接,查看详细的出错信息,对照此信息,可以找出出错原因。

一般来说,这种错误主要是由 Linux 环境下相关编译器与你使用的本地编译器之间的差异造成的Judging

我们正在运行你的程序进行测试,请稍候。

Rejudging

我们更新了测试数据或者评判程序,并且正在进行重测,这个过程比较耗费资源,请稍候。Time Limit Exceeded

你的程序运行的时间超过了该题规定的最大时间,你的程序被Online Judge强行终止。

注意:TE并不能说明你的程序的运行结果是对还是错,只能说明你的程序用了太多的时间。Memory Limit Exceeded

你的程序运行时使用的内存,超过了该题规定的最大限制,或者你的程序申请内存失败,你的程序将被Online Judge强行终止。

注意:ML并不能说明你的程序的运行结果是对还是错,只能说明你的程序用了或者申请了太多的内存。

Function Limit Exceeded

你的程序运行时使用我们不允许使用的调用,将会得到此错误,诸如文件操作等相关函数。请特别注意:system(“PAUSE”);也会导致此错误。

Output Limit Exceeded

你的程序输出了太多的东西。

Online Judge规定提交的程序在运行的时候只能输出1024K字节的东西,如果你输出太多,将导致此错误。

我们保证所有的题目的标准输出都小于1024K字节。

Runtime Error

你的程序出现了“运行时错误”。

大部分情况下,NKOJ系统将返回给你一个Runtime Error的编号,由SIG或FPE开头,后面跟随一个整数。具体的解释请点击此处查看。

System Error

系统发生了错误。由于异常因素导致系统没有正常运作。我们尽力保证系统的稳定运行,但如您遇此情况,请联系管理员。

Online Judge 支持哪些编程语言?

到目前为止,本 Online Judge 已经支持 C、C++、PASCAL、JAVA 编程语言

OnlineJudge中,你的程序的输入和输出是相互独立的,因此,每当处理完一组测试数据,就应当按题目要求进行相应的输出操作。而不必将所有结果储存起来一起输出。

定义64位数使用 long long 类型,输出格式串中使用 %lld 表示64位数。

本系统内核部分作者:孙威、王岩,WEB部分作者:王岩。独立自主开发,保留一切权利。

南开大学信息学院、南开大学ACM协会 如果题目包含多组测试数据,我应该在何时输出我的结果?GCC 中如何使用64位数?关于本系统

Runtime Error 代号介绍

SIG(Signal,Linux系统信号)部分:

(4)SIGILL 执行了非法指令.通常是因为可执行文件本身出现错误, 或者试图执行数据段.堆栈溢出时也有可能产生这个信号.(6)SIGABRT 程序自己发现错误并调用abort时产生.(6)SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.(7)SIGBUS 非法地址, 包括内存地址对齐(alignment)出错.eg: 访问一个四个字长的整数, 但其地址不是4的倍数.(8)SIGFPE 在发生致命的算术运算错误时发出.不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.(11)SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.造成这种错误的原因有很多,主要原因有三条:

一、数据下标越界,包括越上界和越下界。

二、堆栈溢出,比如递归层数过多。

三、不恰当的指针使用。

FPC(由Free Pascal 产生的错误代码):

由于OJ系统已经限制了程序的行为,所以以下部分代码并不会实际出现,此处列举仅仅为了文档相对完整。Invalid function number 错误的功能代码File not found 文件未找到Path not found 目录未发现Too many open files 打开太多的文件File access denied 文件访问拒绝Invalid file handle 错误的文件句柄Invalid file access code 错误的文件访问代码Invalid drive number 错误的驱动器数字Cannot remove current directory 不能移动当前目录Cannot rename across drives 不能跨越驱动器更改文件名

Disk read error 磁盘读错误

Disk write error 磁盘写错误

File not assigned 文件未曾建立关联

File not open 文件未打开

File not open for input 文件不能打开读数据

File not open for output 文件不能打开写数据

106Invalid numeric format 错误的数字格式

从标准输入(Text文件)中预期得到的数字格式不对.150 Disk is write-protected

151 Bad drive request struct length

152 Drive not ready

154 CRC error in data

156 Disk seek error

157 Unknown media type

158 Sector Not Found

159 Printer out of paper

160 Device write fault

161 Device read fault

162 Hardware failure

200Division by zero

被除数为0.201Range check error

如果你编译你的程序时设置了方位检查,原因有可能是:

数组访问超过了声明的范围.试图给一个变量赋值超过其范围(例如枚举类型).202Stack overflow error

栈溢出

栈增长超过了最大值(in which case the size of local variables should be reduced to avoid this error), or the stack has become corrupt.只有当栈检查时才出现该错误.203Heap overflow error

堆溢出

堆增长超过了上界.This is caused when trying to allocate memory exlicitly with New, GetMem or ReallocMem, or when a class or object instance is created and no memory is left.Please note that, by default, Free Pascal provides a growing heap, i.e.the heap will try to allocate more memory if needed.However, if the heap has reached the maximum size allowed by the operating system or hardware, then you will get this error.204Invalid pointer operation

错误的指针操作

使用 Dispose or Freemem 时使用错误的指针(特别的, Nil)

205Floating point overflow

浮点数上溢

你试图使用或产生一个太大实数.206Floating point underflow

你试图使用或产生一个太小实数.207Invalid floating point operation

错误的浮点数操作

可能是你开平方根或者对数时使用负数.210Object not initialized

对象未初始化

When compiled with range checking on, a program will report this error if you call a virtual method without having called istr constructor.211 Call to abstract method 212 Stream registration error 213 Collection index out of range 214 Collection overflow error

215Arithmetic overflow error 数字超出范围 例如3000000000超出长整形范围

216 General Protection fault

217 Unhandled exception occurred 219 Invalid typecast

227 Assertion failed error

第三篇:ACM赛后总结

赛后总结

虽然已经是大二第二学期了,这却是我的第一真正的ACM比赛经历,赛后感觉自己水平很差,感觉很不好,或许只有受到了了打击,才会有成长,也只有在一次次的打击中吸取经验,成为自己前进的动力。

这次比赛总结起来发现了我们的好多不足之处,第一个就是我们经验的缺失,毕竟是我们第一次参加这样的比赛,还有就是对做题顺序的把握不好,对题目难易程度判断不准确,如果做一个题发现思路错了,我们应该要及时改变思路,跳过去,先去做下面容易的题,等回过头来在做,要用尽量短的时间把我们知道做的题做出来,有些题,我们有思路,不敢保证完全做出来,就放到后面再去做,还有就是比赛的时候心态不好,中间做的时候就比较焦急,这样对自己的思路也会有影响,要调节好自己的情绪,还有就是要及时改变策略,多看榜,看到有很多人a的题目,我们肯定要去看一下,一开始我们就应该把题目全部都看一遍,最重要的是我们的实力还是不行,对于有些简单的题目还是不够熟练,思路不够清晰,下阶段要进一步有针对的加强训练!

比赛结束,我们真的是百感交集,有过遗憾,有过不甘心,有过失望,本来这次比赛应该是很好拿奖的,但最终我们还是与奖状擦肩而过,可能与经验的缺乏有关,我想更多的应该还是实力的差距,自己的实力不行,做什么都是白搭。所幸的是,我们明年还有一次机会,再努力一年,我想我们明年再战的时候,一定可以取得一个很好的成绩。

14物联网 贾文彪

第四篇:ACM算法总结——超有用!

初期: 一.基本算法:

(1)枚举.(poj1753,poj2965)

(2)贪心(poj1328,poj2109,poj2586)

(3)递归和分治法.(4)递推.(5)构造法.(poj3295)

(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:

(1)图的深度优先遍历和广度优先遍历.(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)

(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)

(3)最小生成树算法(prim,kruskal)

(poj1789,poj2485,poj1258,poj3026)

(4)拓扑排序(poj1094)

(5)二分图的最大匹配(匈牙利算法)(poj3041,poj3020)

(6)最大流的增广路算法(KM算法).(poj1459,poj3436)三.数据结构.(1)串(poj1035,poj3080,poj1936)

(2)排序(快排、归并排(与逆序数有关)、堆排)(poj2388,poj2299)

(3)简单并查集的应用.(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)

(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)

(5)哈夫曼树(poj3253)

(6)堆

(7)trie树(静态建树、动态建树)(poj2513)四.简单搜索

(1)深度优先搜索(poj2488,poj3083,poj3009,poj1321,poj2251)

(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)

(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)五.动态规划

(1)背包问题.(poj1837,poj1276)

(2)型如下表的简单DP(可参考lrj的书 page149):

1.E[j]=opt{D+w(i,j)}(poj3267,poj1836,poj1260,poj2533)

2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij}(最长公共子序列)

(poj3176,poj1080,poj1159)

3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)六.数学

(1)组合数学:

1.加法原理和乘法原理.2.排列组合.3.递推关系.(POJ3252,poj1850,poj1019,poj1942)

(2)数论.1.素数与整除问题

2.进制位.3.同余模运算.(poj2635, poj3292,poj1845,poj2115)

(3)计算方法.1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)七.计算几何学.(1)几何公式.(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等).(poj2031,poj1039)

(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)

(poj1408,poj1584)

(4)凸包.(poj2187,poj1113)中级: 一.基本算法:

(1)C++的标准模版库的应用.(poj3096,poj3007)

(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)二.图算法:

(1)差分约束系统的建立和求解.(poj1201,poj2983)

(2)最小费用最大流(poj2516,poj2516,poj2195)

(3)双连通分量(poj2942)

(4)强连通分支及其缩点.(poj2186)

(5)图的割边和割点(poj3352)

(6)最小割模型、网络流规约(poj3308,)三.数据结构.(1)线段树.(poj2528,poj2828,poj2777,poj2886,poj2750)

(2)静态二叉检索树.(poj2482,poj2352)

(3)树状树组(poj1195,poj3321)

(4)RMQ.(poj3264,poj3368)

(5)并查集的高级应用.(poj1703,2492)

(6)KMP算法.(poj1961,poj2406)四.搜索

(1)最优化剪枝和可行性剪枝

(2)搜索的技巧和优化(poj3411,poj1724)

(3)记忆化搜索(poj3373,poj1691)

五.动态规划

(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)

(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)

(2)记录状态的动态规划.(POJ3254,poj2411,poj1185)

(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)六.数学

(1)组合数学:

1.容斥原理.2.抽屉原理.3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).4.递推关系和母函数.(2)数学.1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)

2.概率问题.(poj3071,poj3440)

3.GCD、扩展的欧几里德(中国剩余定理)(poj3101)

(3)计算方法.1.0/1分数规划.(poj2976)

2.三分法求解单峰(单谷)的极值.3.矩阵法(poj3150,poj3422,poj3070)

4.迭代逼近(poj3301)

(4)随机化算法(poj3318,poj2454)

(5)杂题.(poj1870,poj3296,poj3286,poj1095)七.计算几何学.(1)坐标离散化.(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)

(3)多边形的内核(半平面交)(poj3130,poj3335)

(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)高级:

一.基本算法要求:

(1)代码快速写成,精简但不失风格

(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)

(2)保证正确性和高效性.poj3434 二.图算法:

(1)度限制最小生成树和第K最短路.(poj1639)

(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)

(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446

(3)最优比率生成树.(poj2728)

(4)最小树形图(poj3164)

(5)次小生成树.(6)无向图、有向图的最小环

三.数据结构.(1)trie图的建立和应用.(poj2778)

(2)LCA和RMQ问题(LCA(最近公共祖先问题)有离线算法(并查集+dfs)和 在线算法

(RMQ+dfs)).(poj1330)

(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的 目的).(poj2823)

(4)左偏树(可合并堆).(5)后缀树(非常有用的数据结构,也是赛区考题的热点).(poj3415,poj3294)四.搜索

(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)

(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法.(poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)

(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法.(poj3131,poj2870,poj2286)五.动态规划

(1)需要用数据结构优化的动态规划.(poj2754,poj3378,poj3017)

(2)四边形不等式理论.(3)较难的状态DP(poj3133)六.数学

(1)组合数学.1.MoBius反演(poj2888,poj2154)

2.偏序关系理论.(2)博奕论.1.极大极小过程(poj3317,poj1085)

2.Nim问题.七.计算几何学.(1)半平面求交(poj3384,poj2540)

(2)可视图的建立(poj2966)

(3)点集最小圆覆盖.(4)对踵点(poj2079)八.综合题.(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)

Dp状态设计与方程总结

1.不完全状态记录

<1>青蛙过河问题

<2>利用区间dp

2.背包类问题

<1> 0-1背包,经典问题

<2>无限背包,经典问题

<3>判定性背包问题

<4>带附属关系的背包问题

<5> +-1背包问题

<6>双背包求最优值

<7>构造三角形问题

<8>带上下界限制的背包问题(012背包)

3.线性的动态规划问题

<1>积木游戏问题

<2>决斗(判定性问题)

<3>圆的最大多边形问题

<4>统计单词个数问题

<5>棋盘分割

<6>日程安排问题

<7>最小逼近问题(求出两数之比最接近某数/两数之和等于某数等等)

<8>方块消除游戏(某区间可以连续消去求最大效益)

<9>资源分配问题

<10>数字三角形问题

<11>漂亮的打印

<12>邮局问题与构造答案

<13>最高积木问题

<14>两段连续和最大

<15>2次幂和问题

<16>N个数的最大M段子段和

<17>交叉最大数问题

4.判定性问题的dp(如判定整除、判定可达性等)

<1>模K问题的dp

<2>特殊的模K问题,求最大(最小)模K的数

<3>变换数问题

5.单调性优化的动态规划

<1>1-SUM问题

<2>2-SUM问题

<3>序列划分问题(单调队列优化)

6.剖分问题(多边形剖分/石子合并/圆的剖分/乘积最大)

<1>凸多边形的三角剖分问题

<2>乘积最大问题

<3>多边形游戏(多边形边上是操作符,顶点有权值)

<4>石子合并(N^3/N^2/NLogN各种优化)

7.贪心的动态规划

<1>最优装载问题

<2>部分背包问题

<3>乘船问题

<4>贪心策略

<5>双机调度问题Johnson算法

8.状态dp

<1>牛仔射击问题(博弈类)

<2>哈密顿路径的状态dp <3>两支点天平平衡问题

<4>一个有向图的最接近二部图

9.树型dp

<1>完美服务器问题(每个节点有3种状态)

<2>小胖守皇宫问题

<3>网络收费问题

<4>树中漫游问题

<5>树上的博弈

<6>树的最大独立集问题

<7>树的最大平衡值问题

<8>构造树的最小环

第五篇:ACM程序设计培训总结

C语言篇

学生信息管理系统 #include “stdio.h” #include “stdlib.h” #define LEN sizeof(struct student)struct student

/*结构体类型*/ { int num;float score;struct student *next;};int n=0;

/*记录链表结点个数*/ struct student *head;

/*链表头指针*/ void menu();

/*DOS菜单函数*/ struct student *creat();

/*链表创建函数*/ void prin(struct student *head);

/*链表输出函数*/ struct student *insert(struct student *head);/*链表添加函数*/ struct student *del(struct student *head);

/*链表删除函数*/ struct student * paixu(struct student *head);/*排序函数*/ struct student *xiugai(struct student *head);/*修改函数*/ void seach();

void menu(){

int i;

printf(“n t 1t创建学生表n”);printf(“n t 2t添加学生数据n”);printf(“n t 3t显示学生信息n”);printf(“n t 4t排序学生记录n”);printf(“n t 5t修改学生记录n”);

printf(“n t 6t删除学生记录n”);

printf(“n t 7t查找学生记录n”);printf(“n t 0t退出n”);

printf(“n t 请输入你的选择(0-4):”);

scanf(“%d”,&i);switch(i){

case 1: head=creat();break;

case 2: head=insert(head);break;

case 3: prin(head);break;

case 4: head=paixu(head);break;

case 5: head=xiugai(head);break;

case 6: head=del(head);break;

case 7: seach();break;

case 0: exit(0);

default:printf(“n选择错误!请按照下面提示选择。”);}

menu();} void main(){

menu();}

struct student *creat()

/*此函数带回一个指向链表头的指针*/ {

struct student *head,*p1,*p2;n=0;head=NULL;p1=(struct student *)malloc(LEN);/*创建第一个结点*/ printf(“请输入第1个学生学号及成绩(学号与成绩以空格隔开,'0 0'结束):”);scanf(“%d%f”,&p1->num,&p1->score);p1->next=NULL;while(p1->num!=0)

/*应该将结点加入链表*/ { ++n;if(n==1)head=p1;

/*是第一个结点,作表头*/ else p2->next=p1;

/*不是第一个结点,作表尾*/ p2=p1;p1=(struct student*)malloc(LEN);/*开辟下一个结点*/ printf(“请输入第%d个学生学号及成绩(学号与成绩以空格隔开,'0 0'结束):”,n+1);scanf(“%d%f”,&p1->num,&p1->score);p1->next=NULL;} free(p1);

/*释放最后一个结点所占的内存*/ return(head);/*返回链表的头指针*/ }

void prin(struct student *head)

/*链表输出函数*/ {

struct student *p;

if(head==NULL)

printf(“链表不存在,请先创建!”);

else

{

p=head;

for(;p!=NULL;)

{

printf(“%d号学生成绩:%fn”,p->num,p->score);

p=p->next;

}

} }

struct student *insert(struct student *head){ struct student*p0,*p1,*p2;int i;char ch='y';p1=head;

/*p1指向第一个结点*/

if(head==NULL)printf(“链表不存在,请先创建!”);else

{

while(ch=='Y'||ch=='y'){ p0=(struct student*)malloc(LEN);

printf(“请输入新结点的数据,输入'0 0'放弃插入:”);

scanf(“%d%f”,&p0->num,&p0->score);p0->next=NULL;

if(p0->num==0)

{ free(p0);

}

else

{ printf(“输入结点插入的位置:”);

scanf(“%d”,&i);

if(i==0)

/*作为表头*/

{

p0->next=head;

head=p0;

}

else

{

while(i>1&&(p1!=NULL))

{

p2=p1;

p1=p1->next;

i--;

}

/*找插入点*/

p0->next=p1;

/*插到p2指向的结点之后*/

p2->next=p0;

}

++n;

/*结点数加1*/

}

printf(“n数据添加成功!是否继续(y或Y继续,任意键退出):”);

getchar();

ch=getchar();} } return(head);}

struct student *del(struct student *head)/*形参num为需删除的学号*/ { int i;

char ch='y';struct student *p1,*p2;

while(ch=='Y'||ch=='y'){ if(head==NULL){ printf(“n链表不存在!n”);break;

/*链表为空*/ } else {

p1=head;

/*从头结点开始查找*/

printf(“请输入要删除的学生学号:”);

scanf(“%d”,&i);

getchar();

while(i!=p1->num&&p1->next!=NULL)

/*p1指向的不是所要找的结点,并且没有到表尾*/

{

p2=p1;

p1=p1->next;

/*后移一个结点*/

}

if(i==p1->num)

/*找到了需删除的结点*/

{

if(p1==head)

/*p1指向的是头结点*/

head=p1->next;/*第二个结点成为新的头结点*/

else

p2->next=p1->next;/*后继结点的地址赋给前一结点*/

printf(“%d号学生已经被删除n”,i);

free(p1);

/*释放结点所占的内存*/

n--;

/*链表结点数减1*/

printf(“n数据删除成功!是否继续(y或Y继续,任意键退出):”);

ch=getchar();

}

else

{

printf(“%d 号学生不存在或已经被删除!n”,i);/*找不到删除结点*/

printf(“n是否继续(y或Y继续,任意键退出):”);

ch=getchar();

} }

}

return(head);}

struct student * paixu(struct student *head)

/*排序函数*/ {

struct student *p0,*p1,*p2,*pt;

/*p0代表p1的前个结点*/

/*p1代表当前正排序的结点*/

/*p2用来取p1后面的每个结点来与P1比较*/ int i;

/*i=1表示头结点排序*/ if(head==NULL)

{

printf(“链表不存在,先创建!n”);

}

else if(n>1)

{

p0=p2=p1=head;

for(i=1;p1->next!=NULL;i++)

/*选择法排序算法*/

{

for(;p2->next!=NULL;)

if(p1->num>p2->next->num)

{

pt=p1;

p1=p2->next;

p2->next=p1->next;

p1->next=pt;

}

else p2=p2->next;

/*若不要交换,则p2指针后移*/

if(i==1)p0=head=p1;

/*对第一个结点排序时处理*/

else

/*其他结点排序时处理*/

{ p0->next=p1;

p0=p1;

}

p2=p1->next;

p1=p1->next;

}

prin(head);

/*调用输出函数*/

}

return(head);}

struct student *xiugai(struct student *head)

/*修改函数*/ { struct student *p;

int m;

printf(“n请输入要修改数据的学号(0退出):”);

scanf(“%d”,&m);

while(m!=0)

{ p=head;

for(;p->num!=m&&p->next!=NULL;)

p=p->next;

if(p->num==m)

{ printf(“n请输入新的数据(学号 成绩):”);

scanf(“%d%f”,&p->num,&p->score);

printf(“n修改成功!”);

printf(“n若继续修改,请输入学号(0退出):”);

}

else

printf(“n该学生不存在,请重新输入学号(0退出):”);

scanf(“%d”,&m);

}

return(head);}

void xuehao(struct student *head)

/*按学号查找函数*/ { struct student *p;

int m,leap;

printf(“n请输入要查找的学号:”);

scanf(“%d”,&m);

while(m!=0)

{ p=head;

leap=0;

for(;p->next!=NULL;)

{

if(p->num==m)

{printf(“n你要查找的学生信息为: 学号 %d 成绩 %fn”,p->num,p->score);

leap=1;

}

p=p->next;

}

if(leap==1)

printf(“n若继续查找,请输入学号(0退出):”);

else

printf(“n该学生不存在,请重新输入学号(0退出):”);

scanf(“%d”,&m);

}

}

void chengji(struct student *head)

/*按成绩查找函数*/ { struct student *p;

int leap;

float m;

printf(“n请输入要查找的成绩:”);

scanf(“%f”,&m);

while(m>=0)

{ p=head;

leap=0;

for(;p->next!=NULL;)

{

if(p->num==m)

{printf(“n你要查找的学生信息为: 学号 %d 成绩 %fn”,p->num,p->score);

leap=1;

}

p=p->next;

}

if(leap==1)

printf(“n若继续查找,请输入成绩(负数退出):”);

else

printf(“n该学生不存在,请重新输入成绩(负数退出):”);

scanf(“%f”,&m);

}

}

void seach()

/*查找子菜单*/ {

int i;

printf(“n t 1 按学号查找n”);printf(“n t 2 按成绩查找n”);printf(“n t 0 返回上级菜单n”);printf(“n t

请输入你的选择:”);scanf(“%d”,&i);switch(i){

case 1: xuehao(head);break;

case 2: chengji(head);break;

case 0: menu();break;

default:printf(“n选择错误!请按照下面提示选择。”);} seach();}

数据结构篇

//huffman.cpp 求Huffman编码 #define UNIT_MAX 65535

//函数结果状态代码

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

#define INFEASIBLE-1 #define OVERFLOW-2

#include #include #include #include

//Status 是函数的类型,其值是函数结果状态代码 typedef int Status;

//Huffman树&Huffman编码的存储表示

typedef struct{ unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;//动态分配数组存储Huffman树 typedef char **HuffmanCode;/* int min(HuffmanTree t,int i){ //函数void select()调用

int j,flag;unsigned int k=UNIT_MAX;for(j=1;j<=i;j++)

if(t[j].weight

{

k=t[j].weight;

flag=j;

} t[flag].parent=1;

return flag;}

void select(HuffmanTree t,int i,int &s1,int &s2){ //s1为最小的两个值中序号小的那个

int j;s1=min(t,i);s2=min(t,i);if(s1>s2){

j=s1;

s1=s2;

s2=j;} } */

void select(HuffmanTree t,int i,int &s1,int &s2){ int j;s1=0;s2=0;

unsigned int small1,small2;

small1=UNIT_MAX;small2=UNIT_MAX;

for(j=1;j<=i;j++)

//选出两个权值最小的根结点

{

if(t[j].parent==0)

if(t[j].weight

{

small2=small1;

//改变最小权、次小权及对应的位置

small1=t[j].weight;

s2=s1;

s1=j;

}

else

{

if(t[j].weight

{

small2=t[j].weight;//改变次小权及位置

s2=j;

}

} } }

void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n){ // 算法6.12 // w存放n个字符的权值(均>0),构造哈夫曼树HT,// 并求出n个字符的哈夫曼编码HC int m,i,s1,s2;unsigned c,cdlen;

HuffmanTree p;char *cd;

if(n<=1)return;m = 2 * n1, 2n consecutively in clockwise order on the ground to form a circle, and then, to draw some straight line segments to connect them into number pairs.Every number must be connected to exactly one another.And, no two segments are allowed to intersect.It's still a simple game, isn't it? But after you've written down the 2n numbers, can you tell me in how many different ways can you connect the numbers into pairs? Life is harder, right? 卡特勒数

import java.math.*;import java.util.*;public class Main{

public static void main(String args[])

{

Scanner as=new Scanner(System.in);

int n,i;

BigDecimal[] a=new BigDecimal[101];

a[0]=BigDecimal.valueOf(1);

for(i=1;i<101;i++)

{

a[i]=a[i-1].multiply(BigDecimal.valueOf(4*i-2));

a[i]=a[i].divide(BigDecimal.valueOf(i+1));

}

while(i>0)

{

n=as.nextInt();

if(n==-1)

break;

System.out.println(a[n]);

}

} }

筛选法 七夕节

除了筛选素数外,还能筛选因子(倍数的运用)#include #define max 500000 int a[max+1]={0};int main(){ int t,n,i,j;a[0]=a[1]=0;for(i=1;i<=max/2;i++)

for(j=i+i;j<=max;j+=i)

a[j]+=i;

scanf(“%d”,&t);

while(t--)

{

scanf(“%d”,&n);

printf(“%dn”,a[n]);

}

return 0;}

母函数

Ignatius and the Princess III

“Well, it seems the first problem is too easy.I will let you know how foolish you are later.” feng5166 says.“The second problem is, given an positive integer N, we define an equation like this: N=a[1]+a[2]+a[3]+...+a[m];a[i]>0,1<=m<=N;My question is how many different equations you can find for a given N.For example, assume N is 4, we can find: 4 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1;so the result is 5 when N is 4.Note that ”4 = 3 + 1“ and ”4 = 1 + 3“ is the same in this problem.Now, you do it!” Input The input contains several test cases.Each test case contains a positive integer N(1<=N<=120)which is mentioned above.The input is terminated by the end of file.Output For each test case, you have to output a line contains an integer P which indicate the different equations you have found.#include using namespace std;const int lmax=10000;int c1[lmax+1],c2[lmax+1];int main(){

int n,i,j,k;

while(cin>>n)

{

for(i=0;i<=n;i++)

{

c1[i]=0;

c2[i]=0;

}

for(i=0;i<=n;i++)

c1[i]=1;

for(i=2;i<=n;i++)

{

for(j=0;j<=n;j++)

for(k=0;k+j<=n;k+=i)

{

c2[j+k]+=c1[j];

}

for(j=0;j<=n;j++)

{

c1[j]=c2[j];

c2[j]=0;

}

}

cout<

}

return 0;} 贪心算法(排序函数)#incluide Int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;} Qsort(a[0],n,sizeof(a[0]),cmp);

下载ACM中WA方面的错误总结(五篇模版)word格式文档
下载ACM中WA方面的错误总结(五篇模版).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    ACM题目分类总结及pku题目分类

    ACM题目分类总结及pku题目分类 ACM-题型分类的代码 主流算法: 1.搜索 //回溯 2. DP(动态规划)3.贪心 4.图论 //Dijkstra、最小生成树、网络流 5.数论 //解模线性方程 6.计算几何 //......

    ACM 筛素数总结(含五篇)

    【总结】关于求素数的说【两种筛法】 (学习小结,请无视) 素数大家都很熟了,不多说了,这里只想说一下求素数。 当然先是唯一素因子分解定理:合数a仅能以一种方式,写成如下的乘积形......

    PETREL中出现错误总结

    PETREL可以通知井斜数据找到斜井和校直段之间的关系。 把TVD当成MD导入,然后导出数据,与垂直段曲线找到关系。 深度数据应为依次增大的,上图错误为深度变小,不能导入。 应检查井......

    PCB设计中常见设计错误大总结

    PCB设计过程中最容易犯的错误汇总。 一、字符的乱放 1、字符盖焊盘SMD焊片,给印制板的通断测试及元件的焊接带来不便。 2、字符设计的太小,造成丝网印刷的困难,太大会使字符相......

    总结错误

    错误分析:启动tomcat错误 异常:the port already use , jvm_bin 错误原因: 端口被占用 错误改正: 1.修改conf/server.xml文件 修改下列端口或关闭占用相应端口的程序。 错误分......

    股票投资错误中总结出来的经验

    一、买入价本位思想 无论何时、何地、何种情况(市况),都是以自己的买入价作为买出或是继续持有的标准和主要参考。“买入价本位思想”是一种非常低级的错误,但是它又偏偏是投资......

    销售中的错误

    销售新人常犯的七大错误 错误一,在会谈之前没有进行调查。 一个销售员在经过了几个星期的语音留言联系之后,终于与一家潜在客户取得了联系,并安排了会谈。不幸的是,在走进会议室......

    matlab7.8错误总结

    一:matlab7.8中的simulink在‘找不到指定模块’下的打开方式: 一:先到simulink下搜索子xxx.m文件并打开,比如打开get_simulink_errors.m当引子。(必须每次都进行此步骤) 二:再在......