Posts tagged with "Programs"
Wednesday, 18. April 2007, 12:13:23
Analysis, Programs
几周前终于做完了USACO Training的全部题目,感觉收获极丰,便有将这些题目做一总结的想法。
写时根据算法对题目进行分类,只求使自己从USACO中得到的知识条理化、系统化,并不求能给他人什么教诲。
笔耕数日,终于约一周前写完全部四篇初稿。又经过近日的几度增添润色和几位好友的帮忙校对,终能在省选的前夕发布所谓“正式版”。
本人自知水平有限,文中断少珠玑之言,而若此“心得”能为你的OI征程有所裨益,也不枉本人几周来的一番心血。
下载地址
Thursday, 5. April 2007, 11:38:34
Programs
Thursday, 5. April 2007, 10:52:01
Analysis, Programs
这题的算法和最小前缀和类似!要认真体会。
cowxor.cpp
Thursday, 5. April 2007, 08:10:39
Programs
rectbarn.cpp阅读这篇程序,你会感到一股属于逝去的黄金时代的古典气息;是的,这是一篇古色古香的程序。
Thursday, 5. April 2007, 04:54:32
Programs
Thursday, 5. April 2007, 02:03:35
Analysis, Programs
刚开始看到这题时,真的是一点头绪都没有呢。不得已寻觅各种题解……结果众牛异口同声地说:离散化+线段树。于是便开始写……写着写着……觉得真的麻烦死了。又看了USACO官方的Analysis。很惊异于那个程序的长度和编程复杂度(好短啊……)。不过我怎么都觉得这个程序不应该AC的,因为它的时间复杂度大约为O(20000*N)。(我知道……这种写法是错误的。你可以说这是O(N),但是它在n次循环里每次都要扫描一个长度为20000的数组……这就导致了超时。)
那个程序真的需要将两个数组拷贝来拷贝去吗?真的需要每次都扫描整个数组吗?不是的!只需要在每次增值或减值时判断数组的这个元素是否由零变一或由一变零就可以了!这样就大大降低了实际的耗时。(虽然原则上来说没有降低渐进时间复杂度。)
最后的程序只有83行哦!但是却能做到最后一个数据0.204s的效果。太神奇了……
picture.cpp
Wednesday, 4. April 2007, 09:42:07
Programs
我是用的求最小后缀的方法过的。这次编程经历很练了一下静态调试。
hidden.cpp
Wednesday, 4. April 2007, 07:31:16
Analysis, Programs
TASK: charrec
LANG: C++
Compiling...
Compile: OK
Executing...
Test 1: TEST OK [0.036 secs]
Test 2: TEST OK [0.036 secs]
Test 3: TEST OK [0.068 secs]
Test 4: TEST OK [0.128 secs]
Test 5: TEST OK [0.304 secs]
Test 6: TEST OK [0.416 secs]
Test 7: TEST OK [0.592 secs]
Test 8: TEST OK [0.592 secs]
Test 9: TEST OK [0.628 secs]
All tests OK.
YOUR PROGRAM ('charrec') WORKED FIRST TIME! That's fantastic
-- and a rare thing. Please accept these special automated
congratulations.
我只能说……这太神奇了。我也没想到。
虽然基本方法是DP谁都能看出来,但这题看上去真的很麻烦,不过仔细的划分模块以后就可以写得很有条理。
charrec.cpp
Wednesday, 4. April 2007, 05:37:04
Programs
tour.cpp(我承认,今天中午的状态太差,心很不静。改了好多遍这题才对。不过为什么心不静……不说也罢。)
Wednesday, 4. April 2007, 04:26:03
Analysis, Programs
拆点构图。求网络流。然后就是一个一个删点看流的值是否减小1。
要注意每次求完网络流都会把图破坏掉。所以要重新构图。
telecow.cpp
Wednesday, 4. April 2007, 02:04:05
Analysis, Programs
这题……真的是剪枝剪疯了……
已经连描述一遍所有剪枝的勇气都没有了。不过我想我的程序还是比较易懂的。
betsy.cpp
Tuesday, 3. April 2007, 23:58:56
Analysis, Programs
剪枝:
1.第1行第1列都是1-N。
2.最后一行不用搜,一定有解。
3.前两行可以当成置换群用hash保存答案。
(Analysis里面那个剪枝还没看懂……)
1latin.cpp
Tuesday, 3. April 2007, 12:23:30
Programs, Analysis
这题我是用纯DP过的哦!
坦白地说,这题是这几天做出的题里面给我最大快感的一道。感觉真是学到了新东西。这种DP不仅要求出得数,还要方案。而且还要字典序最小的一个方案。所以在更新解的过程中若发现当前解与新解的值相同,就必须要比较两个解的方案的字典序。
milk4.cpp
Tuesday, 3. April 2007, 08:10:36
Analysis, Programs
方法是这样的:
首先,用你喜欢的方法求出强连通子图。然后第一个问题的解就是没有入边的强连通子图的个数,第二个问题的解就是没有出边和没有入边的强连通子图的数目中较大的一个。
schlnet.cpp
Tuesday, 3. April 2007, 07:42:31
Programs
太easy的dp,不过方程写垃圾了……不说也罢。
bigbrn.cpp
Tuesday, 3. April 2007, 03:11:20
Analysis, Programs
通过这题要掌握二维离散区间中的搜索方法,就是不断调整,同时缩小调整的范围。这显然可以推广到更高的维度。但每次调整的次数应有一个上限,否则就会出问题(在USACO的评测机上会超时,似乎是死循环,而在我的电脑上就不会,所以说for(;

还是要慎之又慎啊!)。
fence3.cpp
Tuesday, 3. April 2007, 02:14:58
Analysis, Programs
这竟然是一道完全不用加剪枝的深搜?可是……谁能告诉我这个的复杂度应该怎么算?
snail.cpp
Tuesday, 3. April 2007, 01:20:08
Analysis, Programs
纯搜索,随便加点剪枝就过了。
如果以后有空的话,用链表优化它,应该可以做到1s以内。
wissqu.cpp
Monday, 2. April 2007, 12:53:31
Analysis, Programs
裸凸包……graham-scan。用折腾了半个下午加半个晚上。不断地出低级错误。太累了……不多说什么了。
fc.cpp
Monday, 2. April 2007, 05:58:14
Programs
Monday, 2. April 2007, 02:42:58
Analysis, Programs
很精妙的一个DP。
v[k][j]表示以i和j开头的最长主题。
v[k][j]=s[j+1]-s[k+1]==s[j]-s[k]?v[k+1][k+1]+1:1;
如何减少储存空间?注意状态间的依赖性。按照枚举i和j的距离来求值。我想你应该明白我的意思。
第一次提交没过是因为没看见is at least five notes long这一句。
theme.cpp
Monday, 2. April 2007, 01:47:10
Programs, Analysis
Monday, 2. April 2007, 00:57:42
Programs, Analysis
这是最小割模型的经典应用。最小割的数值自然可以根据定理得出,但如何得出最小割的边呢?我采用的是北极天南星题解中的贪心法。我感觉这个应该有反例——不该这么简单。但是反正AC了。这种方法的确应该记住。
(另:一开始错误的把这题当成最小费用流了……汗……)
milk6.cpp4.7:那个贪心法是正确的。
Sunday, 1. April 2007, 12:24:38
Analysis, Programs
只要你能看出这是拓扑排序。
frameup.cpp4.2:这题写傻了……原来可以不排序的,把边反一下就行了。
Sunday, 1. April 2007, 09:13:41
Programs, Analysis
据说Matrix67的USACO征程就是在这里卡住了,所以我做好了像cryptcow一样打持久战的准备。没想到……今天一天就搞定了。而且……最大的数据不超过0.1s,呵呵。太有成就感了!
说一下比较特别的地方:
1.搜索顺序是先对角线、再边缘、再中间。
2.主要的剪枝依靠V数组,它能告诉你哪怕不完整的一行一列有没有可能是素数。
3.将“两边两数已确定且没有0”和“两边两数已确定且仅有1379组成”的东西建一张表,在搜索边缘的时候可以用到。
总结一下就是:用空间换时间。(这话好俗啊……)
prime3.cpp
Saturday, 31. March 2007, 06:47:04
Programs
Saturday, 31. March 2007, 04:06:48
Programs, Analysis
做这题前我看了北极天南星的题解,但是按照那个编出来的程序却不对(应该是我没理解的缘故),自己想了一个不同的方法(似乎比那个麻烦),但还是对了。
高精运算的确是个不难的东西,特别是在C++里,我先用int编好程序确认了正确性以后直接把声明处的int改成BigNum就行了。
buylow.cpp
Saturday, 31. March 2007, 02:54:14
Programs, Analysis
由于这题的数据规模实在是太小了……所以几乎只要是多项式的算法都能过……汗……我写的就是O(n^3)的,可还是最大的数据0.004……不过显然有更好的方法,看看别人的标程吧。
race3.cpp
Saturday, 31. March 2007, 00:24:01
Programs
Friday, 30. March 2007, 23:39:16
Analysis, Programs
这题实在太有意思了!第一问当然easy,关键是第二问。我们如果从“策略”的角度来想,也就是说每一个从A出来的东西要放到哪个B里,会完全无从下手。
正确的方法是:将两问分开来,也就是先假设两个任务是彼此独立的,都当第一问来求。然后利用单调性,把a[k]和b[n-1-k]配对。over。
job.cpp
Friday, 30. March 2007, 11:36:51
Analysis, Programs
懒了一下,把上题的flow直接复制过来了……不过最后一个数据竟然用0.8xx秒?汗……似乎是我的网络流编得很不到家。(采用邻接矩阵,没有对稀疏图作优化。)
明天再写Hungary。
stall4.cpp3.31:
针对稀疏图进行了优化的网络流(最大的数据0.068s):
stall4(1).cpp使用Hungary算法的程序,加了一点点优化(最大的数据0.004s):
stall4.hungary.cpp
Friday, 30. March 2007, 11:04:56
Programs, Analysis
网络流。用的是广搜增广路。当然了,数据太弱了。(主要是图太稀疏,m太小。)
ditch.cpp
Wednesday, 28. March 2007, 05:35:16
Analysis, Programs
使用的剪枝:
1.前缀后缀的判断。
2.第一个特殊字符必须是C,最后一个特殊字符必须是W。
3.搜索过程中所有COW之间的片断都必须是原文本的子串。(使用Prefix Tree实现)
4.乱写的hash函数判重,不处理冲突。
使用的技巧:
1.使用链表保存字符串,可以是每次变换的时间为O(1)。
2.枚举COW的组合是应先找到O,然后从前面找C,从O后面找W。
起初迟迟不能AC的原因:
对于每次字符串的变换事实上需要分四种情况讨论,否则就会破坏链表造成死循环。
cryptcow.cpp
Friday, 2. March 2007, 09:49:11
Programs, Analysis
搜索题。比较典型的迭代深搜。里面的优化也是比较典型的。我主要用的优化有:
1. 二分答案。
2. 对boards和rails都进行排序。
3. 出现重复的board或rail时可剪枝。
4. 事先试图缩小答案的上限。
5. 每次枚举用那个board放当前的rail时都先寻找有没有和现在的rail完全相同的,如果找到就不再尝试其它board。
fence8.cpp
Monday, 25. December 2006, 13:47:55
Analysis, Programs
先比较麻烦地构图,然后Floyd最小圈即可(这个算法开始没有写对,结果提交了三次)。
fence6.cpp
Sunday, 24. December 2006, 08:08:14
Analysis, Programs
这道题的中文翻译有问题!害我多提交两次。强烈郁闷……不过……谁让咱想省点事儿呢,没法儿埋怨那些义务翻译的好心人啊……
nuggets.cpp
Saturday, 23. December 2006, 11:37:39
Analysis, Programs
一道恶心的计算几何题……计算几何的特点就是可能会出现很多烦人的特殊情况。不过,在我天才的灵感推动下,我成功的尽用了两次提交救过了这道题(第一次提交甚至连判断非规范相交的代码都没有写,而且只有最后一个点没过)。我创造性地发明和使用了所谓的“shake方法”(欲知其详,请研究我程序中的shake函数),这使得特殊情况、刁难人的数据都不在话下一扫而光啦!
fence4.cpp
Thursday, 21. December 2006, 08:03:40
Programs, Analysis
我做的第一道几何题……不过这个不算计算几何,应该算作解析几何吧。那个为了排除恰在线上的点而加上一个小差量再取整的方法是我原创的哦!
fence9.cpp
Thursday, 21. December 2006, 05:50:06
Analysis, Programs
这是一个经典的DP题。第一次提交时第8个数据WA……原因是把一个字母写错了:i写成了t……宛如NOIP的场景重现啊……太失败了。以后对于DP题在提交之前要再把solve程序和方程对照一下,看看solve程序是否重视的体现了方程……
rockers.cpp
Thursday, 21. December 2006, 02:56:41
Programs
Wednesday, 20. December 2006, 04:03:55
Analysis, Programs
一开始我竟然没看出这个是DP……实在是太丢人了……
game1.cpp
Tuesday, 19. December 2006, 10:02:31
Analysis, Programs
搜索,需要加最优性剪枝。先贪心一个上界很有用。
camelot.cpp
Monday, 18. December 2006, 13:31:30
Programs
Monday, 18. December 2006, 04:52:17
Analysis, Programs
我显然把这道题想麻烦了:构图,每种购买商品的组合是一个顶点,每种打折方式是一条边,然后就SPFA……可是显然不用这么麻烦,可以DP的……以后有空了再用DP写个程序。
shopping.cpp
Sunday, 17. December 2006, 08:01:06
Analysis, Programs
单纯的欧拉路问题。在这种问题中常常会有多重图的情况,所以说更好的表示方法是用二维数组表示二者之间边的条数。第一次提交的时候数组开小了……那个记录循环的数组其实应该开到边数而不是点数那么大……郁闷一下。
fence.cpp
Saturday, 16. December 2006, 08:19:44
Analysis, Programs
很不错的广搜题目,用hash表(也就是全排列的康托展开)来判重。虽然最后程序的效率应该还是挺高的(不超过0.2s),但是通过profile分析发现计算hash值的函数占了近80%的时间!求康托展开最高效的方法是什么呢?有O(n)的方法吗?(应该是有的吧)
msquare.cpp
Friday, 15. December 2006, 09:47:54
Programs, Analysis
组合数学问题……以后要加强。
kimbits.cpp
Friday, 15. December 2006, 05:12:30
Programs, Analysis
这题我估计一次通过的人也不会多,很少人会一开始就考虑到被零除的那个问题。吸取经验,以后要谨慎了……
ratios.cpp
Friday, 15. December 2006, 04:40:03
Programs, Analysis
puts这个函数……竟然会自动在输出的字符串后面换行……也就是说必须puts("none");而非puts("none\n");头一次发现……汗……
spin.cpp
Thursday, 14. December 2006, 11:50:15
Analysis, Programs
YOUR PROGRAM ('butter') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
好高兴啊……第一次写SPFA,还真好用呢!
(循环队列好像也是第一次编?这么简单啊……)
butter.cpp
Thursday, 14. December 2006, 09:23:24
Programs
Thursday, 14. December 2006, 07:43:07
Programs
YOUR PROGRAM ('stamps') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
stamps.cpp
Thursday, 14. December 2006, 06:18:22
Analysis, Programs
这道题提交了四遍,不过终于AC了以后还是很有成就感呢!在做这道题的过程中我没有看任何解题报告,后来看到星牛用的是hash表统计,我用的是数组模拟的二叉Trie(就是类似二叉堆那种)。另外,这道题排序似乎是必不可少的吗?ANALYSIS里面的标程也一样有排序。有点疑惑……
contact.cpp
Thursday, 14. December 2006, 04:48:41
Analysis, Programs
(这道题是昨天写的,可昨天中午和下午USACO挂掉了没法提交……晕……)
我看到这道题的第一个想法是二维线段树,后来突然想到可能不用那么麻烦,似乎用离散化也行。于是便编写了一个离散化(由于是第一次写离散化,调试了一会儿),没想到最后一个数据竟会超时……星牛的解题报告中什么用链表保存矩形怎么分割什么的没看懂。不得已看了maigo的标程……那个方法太强悍了,深有所悟。变量z是很有意义的,直观地来说就是矩形从下面往上面浮,如果受到阻拦就分割,如果浮出水面就记录。
rect1.cpp
Tuesday, 12. December 2006, 10:03:37
Programs, Analysis
失败……一道完全按照星牛的解题报告写出来的题……
humble.cpp
Tuesday, 12. December 2006, 05:04:07
Programs
Tuesday, 12. December 2006, 04:45:54
Analysis, Programs
最小生成树……我写的是Kruscal,用到了一个Heap和一个UFSet,运行速度很快的。
agrinet.cpp
Monday, 11. December 2006, 05:33:37
Programs, Analysis
输出格式比较特别,以后就会有经验的……要注意细节问题,比如说N恰好被B整除的情况没有经过仔细测试。
fracdec.cpp
Saturday, 9. December 2006, 12:16:43
Analysis, Programs
简单的Dijkstra,只有52个顶点,什么优化都不用加。只是……要注意这可能并不是一个简单图,有些边会出现多次。要注意:
Sometimes, two (potentially self-same) pastures are connected by more than one path.
由于这个交了两次……郁闷……
comehome.cpp
Saturday, 9. December 2006, 09:00:13
Programs, Analysis
有点繁琐的题目,好在我的思路还算清晰……
第一次提交没有通过的原因是因为某些变量初始化成了-1,这是我以前的习惯,而在某些情况(比如说连通子图里只有一个点时),把这里面的ldis和mldis变量初始化成-1就会有问题,改成0就没事了。
cowtour.cpp
Friday, 8. December 2006, 05:06:32
Analysis, Programs
说实话这道题弄得太丢人了……显然无权图的最短路用DFS最爽。但是我编的第一个程序竟愚蠢到对每个点做一次DFS找出口的地步……无耻地TLE……我开始还在想哪里能够细节优化……太汗了……
maze1.cpp
Thursday, 7. December 2006, 13:46:03
Analysis, Programs
呵呵……很简单的题目。关键是为了找出无解的情况需要进行判重。我采用的是龌龊的6维数组来判重……您可以尽情BS。不过还有更好的判重方法么?毕竟本题的空间完全不成问题……标程的超过160000就输出0的方法我也想到了,不过觉得还是有点太过低级……(当然了,在有时判重相当麻烦的情况下,这种思想是很可以借鉴的。)
ttwo.cpp
Thursday, 7. December 2006, 11:53:28
Analysis, Programs
这道题好麻烦啊……非常可耻地……看了标程……
concom.cpp
Thursday, 7. December 2006, 10:03:12
Programs, Analysis
这是一道原来Chapter6的题……很无奈地看了星牛的解题报告。思路很特别,题目中要求“恰好XX”,然而我们很难直接求出来这个,所以说只能求“最多XX”,然后一算差量立得……
nocows.cpp
Thursday, 7. December 2006, 09:18:23
Programs, Analysis
状态转移方程:
s[k][j]=s[k-1][j]+s[k][j-v[k]];(其中v[k]表示第i种货币)
从这个方程可以看出数组事实上只需要一维。
加上一个小优化:排除大于N的货币,除去重复的货币。最后每一数据不超过0.1秒。
money.cpp
Thursday, 7. December 2006, 05:55:47
Analysis, Programs
Thursday, 7. December 2006, 03:04:04
Analysis, Programs
这道题最优的方法还是用Trie。我写的Trie可是我自己改良的哦!(至少我没见过别人这么写Trie)
prefix.cpp
Wednesday, 6. December 2006, 04:21:33
Programs, Analysis
很考验细心的一道题……要好好读题……(第一遍提交竟然把文件名打错了……runaround……runround……)
runround.cpp
Wednesday, 6. December 2006, 03:42:51
Programs, Analysis
应该是比较经典的DP题吧……方程是F[i,j]=F[i-1,j]+F[i-1,j-i]。其中F[i,j]表示用前i个数组成一个和为j的集合的方法数。不过……这个方程不完全是独立想出来的……BS我吧。
subset.cpp
Wednesday, 6. December 2006, 03:39:29
Programs
Tuesday, 5. December 2006, 06:15:11
Analysis, Programs
没什么好说的……基本上就是一大堆位运算,只要能看出来不管多少个灯事实上只相当于6个灯就万事大吉。凭直觉看出来的C%=12;(因为每个灯算两次就相当于没算),没想到标程更厉害:C只能为1、2、3、4……汗……
lamps.cpp
Monday, 4. December 2006, 12:28:43
Programs, Analysis
由于一点点很小的失误,导致一直TLE:max=1<<(B+1);写成了max=1<<B;(max是搜索数的上界)。
事实上当我的程序运行很长时间结果出来样例WA的时候,就应该从正确性上找问题,而不是再盯着效率。通过这道题我明白了:表面上出现的效率问题事实上有可能是因为程序的正确性没有保证。
hamming.cpp
Monday, 4. December 2006, 11:43:46
Programs, Analysis
其实很简单的,一开始想复杂了……
sort3.cpp
Monday, 4. December 2006, 03:20:39
Analysis, Programs
这题真让我有点欲哭无泪……本来一看是那种深搜求最优解的,就觉得可以用迭代加深,我以前没写过迭代加深,随便一写觉得还真的挺好写的!结果一交上去……TLE……优化了半天,最后1.38s,还是过不去……然后只好反思:难道不应该用迭代加深?最后只好写成了最普通的深搜,每次找到解以后与当前最优解比较判断是否更优。结果最大的数据0.008s(这得益于我程序中本来就保留着的几个优化和剪枝)。实在是郁闷至极啊……
holstein.cpp
Saturday, 2. December 2006, 07:18:51
Analysis, Programs
很简单的一个题……十几分钟就写完了,生成所有的既约真分数,然后排序。(写qsort真是浪费)
frac1.cpp
Saturday, 2. December 2006, 05:57:25
Analysis, Programs
一道很纯粹的Flood Fill……由于粗心,由于这两天由于某些事情状态不好……提交了4次……真是……无话可说了……
castle.cpp
Thursday, 30. November 2006, 13:29:35
Analysis, Programs
这个题太有意思啦!优化方法丰富多彩。而我的AC程序……就是最简单的DFS,加上了一个用链表保存当前可放置的列,没有用对称性优化。你可能会说:你骗人!这种方法我提交过,TLE!呵呵……我首先要感谢我的运气:
Test 8: TEST OK [0.98 secs]
然后,感谢GNU提供的这么好的编译器GCC产生的代码的执行效率……
(据说完全同样的算法用Pascal实现就要1.5x secs……哈哈……)
checker.cpp
Thursday, 30. November 2006, 09:35:52
Analysis, Programs
做这道题的时候出现了一个小插曲:我开始把数据规模看错了……b<=100000000我以为是b<=1000000000……结果用我以为的“极限数据”优化了半天经过了N次Profile之后才勉强跑进1s……结果交上去一看竟然全都是0.0x sec出解……汗啊……
不过锻炼了一下用Profile优化程序的能力,我还意识到把stream换成stdio能优化很多,这也是很不错的。
第一次提交没过样例……汗……这几天做题越来越不仔细了……
pprime.cpp
Wednesday, 29. November 2006, 09:30:23
Programs, Analysis
深搜的思路很简单,关键就是优化时间效率。显然在n比较小的时候我们可以先求一个质数表,但是在n比较大一点的时候就必须试除了(如果我们只考虑确定性算法的话)。我就是先筛出一个质数表,这个质数表的大小不超过500000。在判断某个数是否是质数时,只有超过了质数表的范围才试除。这给程序优化很大。n=8时也不超过0.06sec。
不过有点郁闷的是,第一次提交前没有好好测试,第一个点竟然RE……提交了两次……
sprime.cpp
Tuesday, 28. November 2006, 10:01:28
Programs
Tuesday, 28. November 2006, 10:00:27
Programs, Analysis
这个题一开始用的是纯搜索,就是用一个bool数组往上覆盖矩形。结果可怜的第二组数据就超时了……(我还加了个二分答案……)
然后就知道必须好好考虑题目中列出来的那些情况来处理,结果写了个很麻烦的程序……好在没有写错,提交上去就通过了。
这道题中得到的启示是:在写完搜索之前先不要加剪枝(我一开始写搜索时顺手加了几个剪枝,结果有一个剪错了,让我调试半天。)另外就是不要怕麻烦……仔细考虑问题。
packrec.cpp
Monday, 27. November 2006, 04:25:13
Programs, Analysis
这个题就是深搜,需要判重。判重的bool数组不用写成三维的,写成两维的就可以,另外一维可以用C减去得到。同样的道理search函数的参量也可以只有两个。但是要注意保存的两维中一定要有C桶的量,这样才能方便的从小到大输出。
发现这两天做USACO使得程序风格有所改善,程序写的应该是比较清晰,傻瓜都能看懂那种……同时我也体验到了程序写得尽量情系给调试带来的好处。
又是一遍AC,很高兴呢!
milk3.cpp
Sunday, 26. November 2006, 13:03:41
Analysis, Programs
这个题目虽然是简单的穷举搜索,但是还必须加以优化才能AC。
第一次提交的程序就是完全简单的枚举a和b,由于枚举时a从1开始了……结果第一个点就WA……好失败呀。再说一遍:下次提交前再重读一遍题目好噻?
第二次提交改正了这个低级错误,不出所料的在第8个点TLE了。但是事实上如果在考试中我这个题就会到此为止不再优化了(除非最后还剩下时间),毕竟拿分是硬道理。
然后就是一个简单的优化:把所有的平方数存到一个排了序的list里面,然后枚举a时只枚举这个list里面的数,这样以后就过了。最长的3.xx秒。
当然,这还有优化的空间,比如说可以枚举list中的两个数然后构造下面的等差数列来检查。但是我向来认为拿分就是硬道理,可以AC的程序是没必要再去优化的(除非出于练习算法的目的)。
ariprog.cpp
Sunday, 26. November 2006, 09:16:03
Analysis, Programs
上面那个四个矩形的题看上去太麻烦了……所以就先做了这一题。
首先这个的解法应该是简单的深搜,从0到3枚举每个开关的次数就可以,加上一个最优性剪枝可以提高不少效率(虽然貌似不加也行)。
在这个程序的具体实现中,我采用了非常模块化的设计(感谢C++的inline关键字),这使得程序逻辑比较清晰,调试非常轻松,编写也变得容易。
这个本来可以一遍提交AC的,可是由于不知道末尾多了个空格也会WA而提交了两次……郁闷……
clocks.cpp
Friday, 24. November 2006, 08:44:24
Programs
一遍AC……我觉得这题放到Section 1.3有点不合适啊……
crypt1.cpp
Friday, 24. November 2006, 08:18:36
Analysis, Programs
第一道交了三次的题……彻底郁闷了……
第一次,使用最朴素的枚举,最坏情况O(n^3),最后一个点n=20000就TLE了……呵呵……好像是我的思路还停留在1.2……汗……
第二次,采取枚举中间点向两边扩展的方法(这就是Greedy了),结果第三个点就WA……郁闷的调试了半天,结果很显然——算法只找出了长度为奇数的回文……
第三次,修复了上面的Bug……终于AC了……
calfflac.cpp
Friday, 24. November 2006, 03:24:50
Analysis, Programs
这个题开始时出了点低级错误:竟然把used数组写到for循环里面了……汗……小小练习了一下静态调试,交上去后一次AC。开始时,用c=0的特殊数据测试后输出是错的,改动了一下。结果发现事实上是没有c=0的数据的……再汗……
barn1.cpp
Friday, 24. November 2006, 02:43:22
Programs
敲完代码以后一次编译通过+AC,好高兴啊……不过这道题也的确太简单了点……
milk.cpp
Thursday, 23. November 2006, 12:17:10
Analysis, Programs
还是因为没看清题:
“找出前N个满足大于S……”(finds and prints (in base 10) the first N numbers strictly greater than S)。
大于、大于等于……太失败了。
以后提交前要把题目再细看一遍。
dualpal.cpp
Thursday, 23. November 2006, 11:43:25
Programs
YOUR PROGRAM ('palsquare') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
真不容易……又看到久违的这句话了。好高兴啊!
palsquare.cpp
Thursday, 23. November 2006, 10:21:28
Analysis, Programs
实在是有点失败……多简单的一道题,因为低级错误提交了两次……
下一步一定要提高单次正确率。多做测试貌似是关键。
transform.cpp
Thursday, 23. November 2006, 06:04:41
Programs, Analysis
又是一道提交了两次的题目……这次是怨我没看清题目:between the beginning and the ending of all milking(从挤奶开始一直到挤奶结束),就是说统计的时候不能从0时刻开始……
milk2.cpp
Thursday, 23. November 2006, 05:27:10
Analysis, Programs
第一道提交了两次的题……开始可以过样例,可是不能过答案为N的数据。改动了一个地方以后可以过后者,就提交上去了……谁知改动过程中出现了低级错误,连样例都没过……我晕……
beads.cpp
Wednesday, 22. November 2006, 05:54:46
Programs
Wednesday, 22. November 2006, 05:22:59
Programs
Wednesday, 22. November 2006, 05:18:19
Programs