2016年上半年openjudge一些零散题目总结

来源:互联网 发布:怎样推广淘宝店铺 编辑:程序博客网 时间:2024/05/16 00:29

2016年上半年openjudge一些零散题目总结


概述

在没有开博客之前,我的解题报告总结很零散。2016年上半年,我在两份流行的poj分类题目单子的指导下做了一些题目。题单很多题目当时做不出留了个记号就没去碰了。今天整理出了当时的一份解题报告合集文件,供日后检索。
顺便把它们总结出来,并且重新整理一下题单,并且找出有价值的题目和没做出的题目,暑假可以接着做。

顺便发表一下对openjudge和poj之间的一点看法,poj题目全,discuss版本里有经验的人多,题目检索功能更强大,可惜图形界面不舒服。openjudge有不同课程,虽然题目有些不全但基本在,图形界面舒服。所以我形成了做openjudge,不会做了参考poj的习惯…至于题号,虽然大部分重合但是偶尔不一样还是很令人烦恼的,所以以后尽量记录的时候题目记录完整,省的把自己搞混。


寒假及大一下前半学期没完成的题目总共有
2745/1102 1095 2817 2802 2976 4028 1191 1079 以及 程设43题部分难题

现在还有一部分题目仍然没有解决
2745/1102 LC
1095 数学题
1079 分数
2802 搜索题
4028 四边形费马点
程序设计实习难题 至少有多少只恼人的大青蛙(写出部分正确能AC解答后放弃钻研本题)
以及百练一些交了没过的题目。留待日后完成。


寒假算法练习部分

以下为解题报告单,按第一次提交顺序书写

1002 487-3279

有两种解法,一是排序,调用sort()函数,另一种是hash表统计

1003 Hangover

力学和数列综合,运用杠杆原理和归纳法可以做出数学模型

1004 Financial Management

纯模拟

1005 I Think I Need a Houseboat

解析几何

1006 Biorhythms

数论的纯模拟实现

1007 DNA Sorting

纯模拟求逆序数,注意预处理否则会超时,利用好字母有限的特点

1044 Date bugs

数论的纯模拟实现

1045 Bode Plot

电磁学,需要一些三角函数技巧,尤其注意电势零点

1079 Ratio

连分数或渐进分数,模拟实现,注意精度问题要处理一下,不是很方便。至今还是WA
(未解决)

3299 Humidex

纯模拟,但是要看清题意,要分类讨论,而且公式推导需要细致

2159 Ancient Cipher

纯模拟,讲了凯撒加密法,注意读懂题意的范围,使用sort()只能对结构体或数字线性表用

1142 Smith Numbers

数论题,大致意思是求数字和与质数因子数字和之和相同的数字,暴力搜索过不了,多组输入可能需要预处理。为了节省时间开销要预处理,为了节省空间开销素数表开到平方根级别,做到时间与空间平衡,预处理得当本题可以过

1657

模拟,对国际象棋棋子分类讨论,注意到王的正方形法则,就不需要搜索了(国际象棋残局-王的正方形法则控制兵升变的知识),另外后的处理可以看作车与象的最小值,运用这两点化简代码。注意书本答案代码方法及其简洁,可以参考

1017

纯贪心模拟,步骤较多比较繁琐,细致地一一讨论即可,小心如果用位运算代替乘法注意优先级,以及各种操作的先后,本题特别麻烦,WA了很多次调试很多次才过,注意动态调试与静态查找的结合。另外本题算法没有答案先存着再分配算法好,所以代码很繁琐很难AC

2972

较简单的进制转化,美中不足的是不知道怎么判断一个式子对一切进制不成立,只能预设一个很大的上限,没有好的数学方法去实现

2973

本题一定要结合样例理解清楚题意

2745/1102

LC-display是一个不好写的模拟题,WA
(未解决)

1833

简单的模拟题目,关键是想清楚排列是怎样变成下一个的

1835

不轻松的模拟题,如果想要干净利落的做完需要群表示论和高等代数的知识,关键在于怎么描述清楚问题状态。可以用高等代数观点,用矩阵乘法实现,也可以直接用置换的方法实现旋转代替矩阵乘法实现。无论如何一定要有足够空间想象力,注意右转等于左转复合后转,而下转却不等于上转复合后转,因为手性变了,注意不要想错

2764

简单的入门级别数论题

2785

复杂的模拟题,攻坚。做出来2遍AC,除了第一遍一开始变量忘记初始化之外都是对的(本地调试一下可以避免这个问题),这个题只要有条理一步一步写是可以写对的

1095

数学题,留着,untouched
(未解决)

2706

高精度,似乎为了不超时需要各种技巧比如快速幂,高位进制压位。首先要用数学方法直接计算出位数,那么只要存500位就够了。如果采用了快速幂则计算时间复杂度大大下降,就不必压位了,但是压位这个算法应该要会。另外,本算法采用了数组作为函数变量大大减小了代码复杂,因为只传递了地址所以也没有额外开销,值得提倡这种写法,但是得用临时变量,注意不要再不应该改的时候改数组内容,另外小心边界情况,C++本身不会检查数组越界要自己小心

2804

考察了建立维护与使用一个基本数据库词典的最基本技能,建立数据库以后排序使其有序,查找采用二分查找的方法查找,同时本题如果使用C的字符串库函数会简化代码,但是手工实现也可以,而且这样效率可能更高

2787

简单粗暴的枚举WA,这是为什么?一开始忘记考虑零作除数的问题,现在考虑了还是错。枚举只做顺序计算,增加反减与反除,这样就可以定义运算从左到右枚举,是否有漏洞?
的确有,总结一下,存在三个问题,第一个问题是零做除数的问题,第二是理论问题,上面一个方法无法计算a*b-c*d,所以要特判两种, 一种是依次算,包括反除反减,另一种是二二结合再计算,这样就可以过了,第三是一个小问题,类似 3,3,8,8的数据特别危险,因为除法误差十分大,所以eps不可以取太小,1e-3差不多了。所以企图用简单的方法枚举,必须考虑算法完整性

2756

二叉树的定义,简单数学题

2790

经典迷宫,效率上来说一般广度搜索最好,朴素病毒传染次之但是最好实现,深度搜索最差,但是一般朴素病毒传染都可以过,这题却不行,必须写广度搜索,可是广搜实现有难度,一直run time error,通过调试发现因为搜索状态总数总是大于理论队列最大长度即格子总数,后来才发现是因为发现一个合法后没有立刻划去这一个位置而是等到下一次作为head时候再划去容易造成一个位置被多个来源在一回合内同时搜索到而搜索多次造成上述情况,通过调试发现了这么一个隐蔽错误

2817

对于一个确定的长度判断可行性的最朴素的搜索方法是直接一长根一长根拼过去直到拼完或者拼不出为止,TLE
所以考虑剪枝或者其他优化方法
但是发现一开始犯了一个及其低级的错误,忘记在搜索到一组合法解后停止搜索,事实上每一组解都搜索了,才TLE,后来加入这一点,WA,但是时间不再超时,说明这样加入后由于原来算法不严谨就有错误,经检查,发现是一个静态错误,但是却调用了动态查错才查出来,现在就不存在错误了,只要考虑剪枝就可以了
(上程序设计实习课后解决)

2802

第一个难点是怎么把问题转化为熟悉的迷宫问题,运用搜索技术
朴素的搜索在每个路口都观望一下转弯与否进行回溯,TLE
需要考虑剪枝或者记忆化搜索优化
(未解决)

(2817,2802要考虑剪枝,是更加复杂的搜索技术)

注:程序设计实习的课本以及习题除了搜索与动态规划基本上选择完成

注:2015计算概论实验班期末上机考解题报告见另一文件夹,这里为部分题解

2456

经JHD提示”二分答案+贪心”
不是很简单,一开始发现搜索肯定超时,有没有好的数学方法实现
但是考虑它的对偶问题:用cows数目求minDis最大值-用minDis求cows最大值,这个思路在数学中很常见,当cows与minDis存在严格或者不严格单调关系的时候是严谨的,而后者计算使用贪心算法,比前者容易多了,所以可以二分合法minDis区间来确定minDis最大值,综上所述使用二分答案+贪心

2743

这个很久以前没调对的题,错误非常低级,可见动态查错不是万能的,静态查错很重要

4073

这个很久以前没调对的题,错误非常低级,每组测试数据开始测试之前记得初始化

4068

这个很久以前没调对的题,错误非常低级,同上,每组测试数据开始测试之前记得初始化

2976

这个很久以前没调对的题,TLE,可能是其他错误,但是数据量一大可以写一个读入优化就过了

4028

解析几何问题,要考虑情况很多,例如是否四边形,顶点顺序,四边形凹凸问题所以要用一些计算几何技巧,但是因为计算几何没有系统训练,为了避免计算几何知识,直接做,考虑费马点一定在一下点取到:四个顶点,两对角线或边交点,总结起来就是由四个点构成的C(4,2)条直线中两条直线的交点(若存在),只需要利用轮换性计算出所有点的值再计算最小值即可,但是过于复杂,调试不对,WA
(未解决)

1082

博弈的题目,注意记忆化搜索否则会超时,另外包含日期处理,慢慢做

1481

模拟图像识别的题目,扫描出联通块即可,用bfs实现扫描联通块

1316

简单的数学题目,注意换一个思路,不要直接判断一个数是否符合要求,而是把所有符合要求的数都找出来,开hash表统计

1244

简单的数学计算,先计算坐标再用余弦定理计算距离

1001

需要细心的高精度题目,注意多调试,经常静态查错

1094

Floyed图论做法,但是题意存在小问题,有两种理解,见在openjudge上写的提示

2805

题意是给一系列点找正方形个数
但是朴素算法超时TLE
一个自然想法是O(n^2)枚举已知有序两点找另外两点
如果开hash表可以O(1)读出另外两点存在性,但是空间开销吃不消MLE
如果不开hash表而是把点维护成有序线性表再查找只需O(logn)读出存在性,但是还是超时,可能需要优化,于是采用内联函数优化,还是超时,采用定义宏降低函数开销也超时TLE
(解决)

大一下算法练习部分

2786

递推题,数据较弱,不必使用快速幂

2792

这是刘汝佳算法竞赛书里的经典例题,三种方法
方法一,枚举,O(n^2),没试过
方法二,二分查找,O(nlgn),因为这种写的比较熟了,没再练习了
方法三,利用单调性,排序O(nlgn),查找O(n),写了一下,性能很好
另外,如果用STL实现可以不关注细节,但是时间性能太差了

历年程序设计实习43题也陆续完成,还剩部分难题留待攻坚

2692

这个题一开始在考虑一些算法,但是发现模仿人类思路进行推理过于sophisticated…所以干脆枚举

1191

搜索可以不超时,但是会WA,仔细思考后发现因为强行规定切割顺序减少了切割可能。也就没法通过规定搜索顺序减少搜索,容易TLE,所以要记忆化搜索,日后实现记忆化搜索。记忆化搜索边界条件不好处理,总是WA
(程序设计实习课后解决)

0 0
原创粉丝点击