发信人: fennec (fennec), 信区: Algorithm
标 题: acm 总结 by fennec
发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004)
ACM总结(fennec)
其实在北京比赛完的时候,我就想写了,不过还是早了点,直到上海比赛结束,大家的心中都不是太好受。郭老师有句话:你们这样做也是对的,不成功就成仁。让我的心也能安慰了不少。
我是从大一下学期开始接触ACM的,那时候我们学校才刚刚起步,siyee,wjiang师兄可以说是我的领路人了,冲名次,比做题真是一种幸福的感觉。
大二上学期很有幸与siyee队长,jack学长一起代表学校参加了比赛,那时候我的心情是很放松的,对自己的目标也是ac一道就万岁:)这也是今年我对windsbu说的话。毕竟那时不是队长,所以对我来说,最重要的就是完成队长布置的任务,其次就是在比赛中做出一道适合自己的题目。去年的最好结果是学校排名第九,大家虽然有种遗憾的感觉,但是毕竟是进步了。
到了大二下学期的选拔赛,涌现出了好多人才,很多人都很有能力,但是有一点最遗憾的是:许多人接触的比较晚,可能是因为热身赛或者选拔赛才了解了ACM,而我们学校的ACM训练只是一个课余的活动,不能与许多学校专业的训练来相比。这样的结果是,缺乏底子好的老选手,即使出现了有很强能力的同学,也不能在极短的时间里使他们达到一个相当的高度!
经过了暑假的集训,学校在队伍人选上很是下了一番功夫。从队员到队伍,无不精心研究。可能连统计学的许多知识都用上了:)
最终很高兴能够与codecpp,wind,组成了jojer队,开始我是不太好意思使用jojer这个名字的,我害怕对不起这个名字,所以先暂时叫做j2吧。由于经验少,刚开始训练的时候有一种摸不到头脑的感觉,许多时候知道有问题,但就是不知道该怎么解决,walkoncloud老师就曾经批评过我:你们队伍就是一个“神经病”带着两个“小神经病”一起“神经病”。这当然只是一种玩笑,但是确实是我们队伍初期的症状,什么事情都没有章法,这时候我们只好使用最原始的方法:讨论加总结。每次比赛结束后无论题目简单与否都要首先将所有题目讨论一遍,将做错的,不会的都分配到人继续将它解决。然后大家单独写赛后总结,交到我这里,在经过分析后,再开集体会议,批评+自我批评并制定下一步策略。用我的话说:这种方式挽救了我们,让我们在极短的时间里磨合了起来。
我们队伍最后的分工是:
wind主要负责读题,读题时要将重点难点标记出来,构想出初级的边缘测试数据。并主要负责计算几何以及一些需要推理的数学题目。
codecpp主要负责1-2简单题目,1到中档搜索题,以及编译方面的题目。和wind对边缘题目以及简单题目形成互补,以及调试上的帮助。
fennec主要工作是对wind,codecpp读过的题目进行分类,分析,对简单题目直接决定分配的人手,对中档题的复杂度,题型进行准确分析,引导思考方向。在有时间的情况下组织对较难题目的深层讨论。
我想最后我们还是基本实现这几方面内容的。
具体到了比赛,首先就是网上预赛:两次比赛感觉是发挥了自己的能力,这也算是队伍第一次最严肃认真的比赛了,大家都很尽力,光从赛后东方饺子王的战绩上就能感觉到!
在北京赛区,我们很快的作出了三道题目,但在后面wa在了两道题目的上面。这没有什么太好说的,我们队伍这时候最大的缺点在于对于wa题目的处理。但是最后还是因为罚时少,取得了学校排名第七的成绩。这也是一个可以接受的成绩。
从北京回来就有好多是要做,接连的补作业,以及期末考试,将训练计划打散了不少。这也是很正常的,毕竟在学校和老师看来,学习是最重要的,我们不是培养一个ACM机器。
在上海的比赛就有些不尽人意了,一是疲劳,二是对题目难度缺乏正确的估计,三是一开始比赛的时候就有些乱套,四是没有专心地做一个题,结果都没有做对。但是很多问题都是因为我在大局上把握的失误,我也感觉很自责,不过一切都过去了,希望后来人能够吸取教训吧。
我想对未来的同学有几句话要说:
1 我们几乎没有noi上来的队员,大家只能依靠后期的更加刻苦的努力。
2 我们没有专业的班级或者机制形成职业ACM队伍,所以大家只能尽早的投入进来,用尽一切课余时间去训练。
3 我们不能在数目上和传统强队比拼(除非队伍中的三个人都很强),所以我们要在中低档题目的ac时间和正确率上下功夫。
4 不要抱怨什么,你所要做的就是尽力发挥自己的全部,并在发现问题后努力改正。
5 不要懒得动手,许多题目你觉得自己方法对了,或者怕麻烦就不写了,这是一个最大的缺点,在比赛的时候你可能需要用2-3倍于别人的罚时去做出来。
6 不要只是追求ac数目,作出一道不会的题目胜过做出10道已经会的题目。
7 多交流代码!不要只是闭门造车。
8 养成良好的代码习惯。
9 在平时做题的时候就养成紧张的好习惯,不然在比赛的时候你会很吃亏的!
关于比赛的感觉:最重要的是四个字:天外有天
而对于真正想继续从事ACM事业的同学,我有以下建议:
0 首先了解C/C++,以及数据结构。
1 首先在joj做够50题,这是基本的热身
2 看一本算法书,清华紫皮的感觉简单点
3 在继续做够200题,这时候应该在输入输出上不会出大问题了,并了解了基本算法。
4 看看吴文虎,以及沙特的那本书。
5 在joj做够400题
6 这时候应该能够出山了,可以参加几次各类的竞赛
7 去uva分类做题,这时候不要再在意你的题目数目了,要有目的的,分类训练了
首先可以是动态规划,然后是搜索,然后再是动态规划,然后再是搜索…这种循环往复的方法,并加以总结,会是你自身提高最快的时候。建议一定要作总结,可以参考我后面的例子。(另外一定要用好uva的论坛功能!)
8 在uva训练200题目的时候,可以考虑一些典型代码算法的东西了,如网络流,poly计数,匹配等等。并把这些算法做成模板!并且要加强自己的理论修养了,看看离散数学,组合数学,概率论等等数学方面的东西。
9 总题目到达了1000的时候就可以查缺补漏了,这一段主要以套卷为主,将每次自己不会的题目搞懂就好了!并要适应比赛的节奏!
10 在题目到达1100-1500的时候,算是小成了。这样的同学就应该能够胜任队长了。
11 剩下的只能靠自己了:)
附录1:(动态规划总结)
近日开始学习动态规划,特做些总结。
ZOJ 1011 NTA 本来想从顶至下搜,但是情况复杂,要保存一牌的状态。所以过来,从到数第二牌搜起,寻找可以是最底层成立的状态,然后向前搜,以此类推。
ZOJ 1013 Great Equipment 人数<100,500不太明白,但应该是数的范围。数据小,但是量多,应该是动态规划,可是选法较复杂,如果单独考虑每个人,将组合物品整体考虑,则可以省去物品组合,而且可以知道剩余物品不能在组合成新物品,这时候如果枚举的话,还是指数级,因为可以交叉组合,关键就在于如何对人数进行动态规划吗?莫非是利用前k个人可以产生的物品数进行动态规划?比如说前k个人产生了分别a,b,c,d个物品,则加上新的一人,可得新的状态,中间再用上剪枝?但似乎成了枚举。状态似乎太多了,那么对人数进行递推,但是状态集变换一下,就是abcd的某种形式。现在的难点是对状态集大小的分析,因为它关系到算法的复杂度的衡量。想到了搜索的算法,想到了剪枝。
以下借用了别人的解法!
1013,经典DP
只有最后结论,没有想法过程
我们设计成为这样一个规划过程
编号所有的车辆是1,2,3,4。。。,n
我们设计一个函数F
F(i,x,y) 表示的是前面1...i辆车中装载x件1装备,y件二装备之后
最多还能够装多少的3装备
我们需要求出F(n,*,*)就是i = n的所有的F值
设装备的重量和尺寸分别是这样的
weight[3],size[3],防御defence[3]
而汽车的容量分别是ss[1..n],ww[1..n]
规划过程:
1.i = 1的时候,F(1,x,y)
如果x * weight[0] + y * weight[1] > ww[1] 显然F(1,x,y) 不可行,我们取-1标记不可行
同理 x * size[0] + y * size[1] > ss[1]也是一样
否则 F(1,x,y)可以由除去x,y之后的剩余重量和剩余尺寸算出来
2.设<i已经算出来,计算i的时候,也就是F(i,x,y) (i > 1)
显然F(i,x,y)可以这样算出来,设其中有h件1装备,l件2装备在i车中,则F(i,x,y) =
F(i - 1,x - h,y - l) + 第i车中剩余的空间能够装下的最多的第3种装备的数量,
取F为这些所有的h,l的最大值,当然如果这样的h,l都找不到,则标记为函数值为-1
即不可行
最后得到F(n,x,y)
使用这个结果即可得到题目的解答
所有车辆中装x,y件1装备,2装备的时候还能够装下多少的3装备为F(n,x,y)
这些装备可以组成的组合装备套数可以马上得到,能够达到的最大防御里也可得到
遍历所有可能的x,y即可得到题目所求答案
ZOJ 1022 Parallel Expectations 还是一道麻烦的题,首先要翻译成机器语言,然后开二维数组,存放双方运行到当前状态的值。因为只有加减,直觉(?)上感觉可以存放平均值,那么此题就可解了。
ZOJ 1037 首先和容易就想到找规律,如果可以一笔画,则直线距离,否则要走一个斜线。但是没有很好的动态规划算法。
ZOJ 1039 Number Game 觉得是搜索题,每一个数加入后,要去掉所有他的倍数,以及他与所有不允许的数的和(?),或者考虑动态规划,一共2^20的状态,模拟游戏,算出所有状态的解。即构造解树。有一个假设,每个状态应该只有一个可行的出现状态。不然的话结会不唯一。不知道这种方法算不算搜索树构造动态规划的解?
ZOJ 1052 题目读的好不容易啊!我感觉会用一个while(flag){ up() ;}的算法,计算每次各个容器里还能有什么。然后更新,最后再看看能否变化。得出解。感觉类似于模拟。
ZOJ 1058 Currency Exchange感觉不是动态规划,更像模拟,只要注意舍入就行。
ZOJ 1076 Gene Assembly 首先要定义struct,其次定义排序,可以先按大数正序,再按小数反序排序。从小至大,如果两个大数相同,则舍去小数小的(即后者)。然后利用基因位置,递推,计算到达某一位置时的最大值,可以先赋以前者的值,如果有基因以次为尾,则比较更新。利用struct的排序数组,可以加快速度。
ZOJ 1092 Arbitrage 可以抽象为仁两点之间的最短距离,用三层for循环实现即可,最短距离==最大换算
ZOJ 1093 Monkey and Banana 由于一块可以看成三个不同的块,所以扩充方块,简化题目,使规模成为90,其实进行排序,首先是长,其次是宽。每增加一个计算其放在前面每一个上的最大值。复杂度n*n,这道题也可以反着做,似乎能更快点。
ZOJ 1094 Matrix Chain Multiplication 似乎又不是动态规划,重点只是求值,利用堆栈,即可实现。利用函数模拟也行,遇见左括号,加深一层,遇见右括号返回。
ZOJ 1100 Mondriaan s Dream 被称为简单题?引用一下别人的讲解吧
Assume you could calculate the number of different paintings for a rectangle with c columns and r rows where the first r-1 rows are completely filled and the last row has any of 2c possible patterns. Then, by trying all variations of filling the last row where small rectangles may be spilled into a further row, you can calculate the number of different paintings for a rectangle with r+1 rows where the first r rows are completely filled and the last row again has any pattern.
This straightforwardly leads to a dynamic programming solution. All possible ways of filling a row part of which may already be occupied and spilling into the next row creating a new pattern are genrated by backtracking over a row. Viewing these as transitions from a pattern to another pattern, their number is given by the recursive equation Tc = 2 Tc-1 + Tc-2. Its solution is asymptotically exponential with a base of sqrt(2)+1, which is not a problem for c<=11.
If both h and w are odd, the result is 0. Since the number of paintings is a symmetric function, the number of columns should be chosen as the smaller of the two input numbers whenever possible to improve run-time behaviour substantially.
Judges test data includes all 121 legal combinations of h and w.
ZOJ 1103 Hike on a graph宽度搜索,50*50*50的复杂度,从一个状态,察看能否分成的状态。
ZOJ 1107 Fat Mouse and Cheese 从起点开始,更新其所能到达的点的move值,取较大值,然后每次都选取一个最小的值,让他去更新。或者直接按照cheese的大小排序,按照这样的顺序更新。复杂度100*100*k
ZOJ 1134 Strategic Game 使用backtrack算法,从叶节点开始,一步一步计算,每上升到一个父节点,分开考虑以下情况:任一个字节点选中的最小值,父节点选中的最小值。
ZOJ 1136 Multiple 宽度搜索来构造除法,从起始最小数开始,做除法,保留余数,利用余数构造新数来进行计算。
ZOJ 1147 Formatting Text 只需要记录前k个单词保存为行,并且最后一个在最后所能得到的最小值,扩充时,令新加的在最后,前面添加,中间距离为平均值。
ZOJ 1148 The Game 算出可以一步到达的点对,然后用两点之间距离的算法,或者仅仅用宽度搜索。
ZOJ 1161 Gone Fishing 假设只用前k个,则先将移动时间减去,然后再贪心,比较所有解。
ZOJ 1180 Self Numbers 从前往后计算,要开一个大的bool数组,如果为0则计算
ZOJ 1192 It’s not a Bug,It’s a Feature. 2^20个状态,宽度搜索。
ZOJ 1196 Fast Food 前n个点,开k家店,每新加一个,假设最后一个开在后L个中,其余的k-1个在前n-L中。再利用在k个中开店,应把分配点放在中间则可。
ZOJ 1206 With the Bonus 对于每个位置,需要计算所有两位的情况,状态一共10000*100*10,得出最小的。中间可以部分优化,一定要从后往前推。这样才能构造最优解!
ZOJ 1213 Lubmer Cutting 首先想到的是预处理,将每个部分加上切割的浪费,再将总长也加上,就成了背包问题。如果只是12个的话硬搜应该可以。
ZOJ 1227 Free Candies 如果只有四堆的话,状态数是40^4,所以可以用动态规划解,每次考虑一个能被变化到的状态,由于这时候所有被取出来的已经消掉了,那么剩下来的是确定的,所以仅仅是宽度搜索就行了。
ZOJ 1234 Chopsticks 这道题里面有的筷子可以不用,似乎增加了难度。而解题最重要的诀窍就是先不要考虑选最长的筷子,那么动态规划的时候每增加一个筷子,可以有两种方式,1 和最近的构成一双 2 不使用。感觉应该保存的是由前x个构成m个所得的最小值。于是复杂度是n*k,最后再考虑最长的,从后往前选,逐次去掉最长的,一直要凑够去掉的为止。
ZOJ 1245 Triangles 以前做的,但是居然看不懂自己写的了:)不过有个n^3的算法,共有三种类型的三角,现仅考虑一种,每递推新一行的时候,每多一个节点,找出它前面最长的乡邻位,再比较他上一排对应的点的值,取小值。存储。如果能预处理的话。应该能减到n^2,具体的方式就是,寻找相邻位的时候,与其前面的那个点比较!
ZOJ 1250 Always On the Run 首先可以利用整除来模拟构造每天的时刻表,动态规划用来递推每天可以到达的城市。
ZOJ 1255 The Path 不像是动态规划,仅仅依靠搜索就行,只需要将屏幕的块分类为1,2如果可以连,则输出正确,如果加一块能将1,2互连则输出另外结果。不过如果只是用简单的动态规划模拟,每加入一个,就判断他的连通性,可能也能解题。
ZOJ 1276 Optimal Array Multiplication Sequence 基本的动态规划,从两两算起,再三三,直到n,每次分为两部分求值。
ZOJ 1301 The New Villa 首先想到的就是宽度搜索,灯状态*所在的屋子=10*2^10,可以保存,一步一步类推。即可得解。
ZOJ 1303 Jury Compromise首先将两个值相减,最后求得就是绝对值最小的,利用层数递推每次最多20(层)*20*20(数)*200,但可以剪枝,例如每层最大数纪录,如果先排序的话,算到正的某个数,就会知道肯定是递增的,以此剪枝。
所以要注意动态规划的剪枝!
ZOJ 1345 Best Deal 题目有点不太明白,但是大意应该是从最底层开始向上递推或者化成有向路。不知道是否会有环。选择要支付最少的钱的?还是选择能折合最多钱的?从所有点一起出发?路线长度可以换成支付钱数,但是路线要限制。还是不太理解题意。
ZOJ 1396 The Umbrella Problem 典型题,递推的时候只需要依据规则计算每一排能到达的位置,以此类推,得到结果。
ZOJ 1409 Communication System 首先还是排序,依据发射范围从大到小,然后是价钱。从上向下递推,每考虑一个的时候,如果价钱比以前的还高,排除,否则将其放入,并比较最优值(这里要注意只有当所有的都选择了以后才能比较更新),最后得出最优值。
ZOJ 1425 Crossed Matchings 由[i,j]再推新的[i,j+1]时,赋初值[i,j],然后让第j+1个与前面的匹配,由贪心原则知,在其枚举时,另一行的只有与与其最近的可以得最优值。n^4的复杂度。如果考虑到数据的预处,则可能更优。
ZOJ 1438 Asteroids 很简单的宽度搜索,但主要是3维,注意一下就行。
ZOJ 1459 String Distance and Transform Process 很典型的题,主要比较前m个与后n个的最优值,只是纪录一下中间的变化就行,再构造出来结果。
ZOJ 1462 Team Them Up 没有太多想法,感觉是从人数开始递增,但是状态很多,无法确定状态集。如果能事先找到所有的互相认识的集合就好了。但似乎又是有很多,如何才能简化?如果状态不过,可以记录前k个人的分发,依次递推。
ZOJ 1479 Dweep 确实很无聊的题,很简单但又麻烦的宽度搜索。
ZOJ 1499 Increasing Sequences 保存到k位时所能求出的最小值。
ZOJ 1520 Duty Free Shop 值需要记录分完前k个,第一种巧克力还剩多少(因为可以推出第二中还剩多少),以此类推得出结果。
ZOJ 1524 Supermarket 保存购物数组,记录当前时刻如果购买各种物品所需花费的最少钱。当然得到一个新的数,然后更新当前数组。即可得解。
ZOJ 1536 Labyrinth 由初始图开始进行计算,每次都得到一个更新图,在每次迭代,以次考虑每个点,以及其每个可行的路线,如果可以,就进行累加,的新图,推知答案。
ZOJ 1556 Heroes Of Might And Magic 共要走50步,每一刻的状态集是:100(HP)*N(位置)*10(MP)*10(NM), 所以可以解。
ZOJ 1587 UP 100 不知道宽度搜索行不行。题是看起来太麻烦了。
ZOJ 1066 Squire Ice 据说很难,想了想,类似于点灯问题,从上到下计算,第一行至少有一个1,所以根据这个算出第一行的情况,然后一行一行递推,得解。
POI VI Stage 1 Problem 1 Musketeers 首先要将环拆成链,判断一个人能否最终胜利,关键在于使其为首位的链能够首尾相接,一种方法就是[i.j]=1 if and only if exist [i,k]==1&&[k,j]==1 &&(i win k || j win k) 仅判断一个人是n^3复杂度,n^2 空间,但如果是所有人则要n^3复杂度了。
ACM/ICPC Shanghai 2000. Problem C. Dance Dance Revolution 首先分析状态空间,双脚位置5*5=25 依此类推时,只要考虑将已有的状态扩充为新的状态,比较存储最优值。
CEOI 2001 Day 2 Problem 2 WildCard Patterns 通配符的匹配问题 最重要的是考虑*的问题,有以下情况
1 a b false
2 a a (i+1,j+1)
3 a * (i+1,j) (i+1,j+1)
4 * a (i,j+1) (i+1,j+1)
5 * * (i+1,j) (i,j+1) (i+1,j+1)
中间有许多重复状态,要注意一下,而且感觉笔记本式比较好写
至于问题二,只要得出所有中途记录的所有解,去掉重复的就行。
对于问题三,两两比较看看有没有重复的。但是我不能保证最小。
ACM/ICPC Finals 2002. Problem B. Undecodable Codes 初始的想法是 由长度递推,考虑已有的构成新有的,如果有重复,则比较字典序输出。但是这样的话就没有用到公共的前缀。
每一步肯定是要匹配一个串和一个空串,即求ans[string]=?由于前后是不同的,所以有两个ans。求ans1[string]时,要找出b中所有可以匹配串,逐一尝试的最小值,反之亦然。这就是一个类似于动态规划加搜索的算法了,但是如果长度到了10就可能会用上2^10的空间。查找效率是其次。关键是添加效率。而且用的是二进制的,就没有用上他本身的性质了。
其次,这里面既然至少要用上第一组与第二组各一个,那么就只需要搜索以第一组开始的就行了。
CEOI 2002 Day 1 Problem 1 Bugs Integrated, Inc. 非常可怕的动态规划题,用了我两天的的时间。随意总结一下
1 状态编码 由于递推要考虑到与最后相关的后两排的情况,所以要进行编码,但是由于至于最后一个占用有关,所以简化编码为3。
2 赋初值,在由已有状态推位置状态时,首先赋以一定的初值,中间要用上贪心策略。好像不太对。
3 状态转移,枚举前一个中的每个状态,贪心策略选择,更新。
4 终值,要对最后中的每一个状态比较,来得到最大值。
Balkan Olympiad in Informatics 2003. Day 2 Problem 2. Euro 感觉类似矩阵乘法的算法,如果想求出[i,j]的最大值,要枚举[i,k]+[k,j]的所有值。
2003 广州赛区b题 很酷的动态规划,从上向下,用n^3的动态规划算法,每算到一个新节点i,要考虑所有可能的后一次的停放地点。在每次停放地点中,要找出最长的,然后在所有中选最小的。
04.8.10-04.8.16
By fennec
I will try to use English to write my sentences. Forgive any of my mistakes.
I will also use some color to mark the problem.
Red: I haven’t thought it out.
Pink: Very good problem.
Brown: I can’t make sure of this problem, for example: these may be some other better algorithm. Blue: I have thought out it, but I haven’t write it out.
Black: I have finished it perfectly.
1. UVA 108 Maximum Sum
In this problem, you should enumerate the able range of row (also you can choose line), the do the longest maximum subsequence algorithm to get the answer, and choose the maximum of all the case. So the complexity is n^3 if you pre-dealing the data.
2. UVA 111 History Grading
At first, this problem is about the order with special value. Noting this, the problem is just a longest subsequence problem. I just have O(n*k) algorithm. And in this problem, you can have a exchange way to pretreat your data.
3. UVA 116 Unidirectional TSP
Easy problem, you should just from left to right, and update the value from the three positions, and care up-down connection.
4. UVA 136 Ugly Number
Open a big boolean matrix. Use multiple 2, 3, 5 to cut it, and count it. And I think it will have a combination way to work it out. Use bin-search.
Some one’s Dynamic Programming:
Build a list of ugly numbers bottom up, example:
if we know that 1 is the first ugly number and the only prime factors are 2,3,5, then the next ugly number will be min(2*1,3*1,5*1) which is 2.When we know that 1 and 2 are the first 2 ugly numbers, the next ugly number will be min(2*2,3*1,5*1) which is 3. Note that factor 2 is now multiplied with 2 whereas the rest are still multiplied with 1 .
5. UVA 147 Dollars
First, all number should divide 5 to predigest the problem number, then from small to big, sum all the possible values.
You should pay attention to the change of float to int, use int(x+0.5) instead of int(x).
6. UVA 164 String Computer
Easy problem, operate the minimum of string[i][j], when it comes to string[i][j+1], just check if they are the same sting[i-1][j], or use three ways.
7. UVA 231 Testing the CATCHER
The longest decreasing subsquence.
Writen by fennec
JLU JOJer
附录2:(部分uva题目总结)
题号 名称 类型 算法简述
10600 ACM CONTEST AND BLACKOUT 图算法 第二最小生成树,每次去掉最小生成树种的一条边,然后找到一个构成连通
10601 CUBES POLAY (Z1^8+3*Z2^6+6*Z4^3+6*Z1^2*Z2^5+8*Z3^4)/24,然后要单独计算每一个的展开式
10602 EDITOR NOTTOBAD 贪心 每一步选取与当前字符串有最长相同子串的字符串
10603 FILL 宽度搜索 用当前状态构造新状态,需要堆结构,但是可以用set模拟!
10604 CHEMICAL REACTION 动态规划 笔记簿式的动态规划,有一点最重要,不要清除笔记簿的内容,即使是fill也太费时间,你只需要重新申请一个就行了
10605 Mines 搜索 首先枚举点的排列情况,每选择一个点,使用深度搜索选择离其最近的墙和最近的已经连到墙上的点。
10606 Opening Doors 数学 大数开放再乘方
10607 Siege 图算法 首先求出中间得邻接图形,然后化减为独立的点,加上外围点,求他们的最小生成树
10608 Friends 并查集 求出最大的并查集
10609 Fractal 函数迭代 算至范围即可,问题在于点排序的有效范围的处理
10610 Gopher and Hawks 最短路经 典型算法
10611 The Playboy Climp 二分查找 简单的二分查找,可以利用库函数
10612 Paper Folding 贪心 每次选择保留在外面的最小方式,但是注意最后一次!
10613 Mushroom Misery 构造扫描 维持一个树型结构,将圆化为矩形,再化为线段,最后成为点
10614 Dreadful Vectors 表达式计算 计算带向量的表达式
10615 Rooks 匹配算法 将图中点二分,利用定理
10616 Divisible Group Sums 动态规划 算出前k个选x(0<=x<=k&&x<=m)个,所能构成的除以d各种余数的组合方式的个数
10617 Again Palindromes 动态规划 类似于矩阵乘法O(n^3),对每一种情况考虑第一个元素是保留,删去,或者配对
10618 Tango Tango Insurrection 动态规划 保留上一步可以到达的各种状态,根据当前节拍选择比较更新状态
10619 Advanced Causal Measurements 二分查找 将节点分别按斜率为+1,-1排序,然后对最小高度二分查找
10620 A flea on a chessboard 模拟 从起始点模拟,直到走回起始状态,或者走出棋盘
10621 Jack and Jill 宽度搜索 每次选择距离最远的两个点扩充,要注意两点细节 1 数组清零;2 可以回家!
10622 Perfect Pth Powers 数学 预处理质数,因数分解,求各因数的最大公约数,如果是负数,则需将答案转换成奇数
10623 Thinking Backward 数学 计算出公式后,枚举小数,然后解方程判断
10624 Super Number
10625 GNU = GUN sNotUnix
10626 Buying Coke 贪心,动态规划 注意10+3=8+5,n10+n5/2>=c,直接购买,n10+n5<c 每个5和10与1配对,否则用10与1购买,然后尽可能由2个5购买
10627 Infinite Race
10653 Bombs! NO they are Mines!! 宽度搜索 很典型
10654 The Uxuhul Voting System 动态规划 逆推,每到一个人,根据上层结果在三者中选择,构造自身状态集
10655 Contemplation!Algebra 数学 利用数学推出log级的递归公式
10656 Maximum Sum II 基本 输出非零数
10657 Prince Frog II
10658 ReArrange 动态规划 居然要用unsigned long long 才行,类似于汉诺塔,找出公式
10642 Can You Solve It? 数学 找到规律(1+x+y)*(x+y)+1+x
10650 Determinate Prime 数学 预求质数,注意理解题意,只有完全一组都能输出才输出,此外没有告诉输入是前小后大
10670 Work Reduction
10671 Grid Speed 图算法?
10672 Marbles on a tree 树 构造树去处理,如果是动态规划,要注意特殊情况
10673 Play with Floor and Ceil
10674 Tangents
10675 Revenge of Faucet Flow
10676 Grid Points 枚举 考虑复杂性可知7*10*2*k
10677 Base Equality 进制转换 有10进制转成b1进制在转成b2进制
10678 The Grazing Cow 计算几何 根据表述可以推出就是求椭圆面积
10679 I Lovs Strings!! 字符树 非常的动态规划,但是可以用AC算法进一步计算
10680 LCM 数学 质数计算,需要算出只用一种质因数的数
10681 Teobaldo s Trip 动态规划 由第i天可以到达的地方,推第i+1天可以到达的地方
10682 Forro Party 图算法 宽度搜索,用邻接表比较好
10683 The decadary watch 模拟 简单的计算可以使用setfill和setw
10684 The jackpot 动态规划
10685 Nature 数据结构 并查集,题目有些误解,就是求一个最大的并查集
10686 SQF Problem 字符串处理 比较繁琐的题,题目说得很不清楚,要一个一个读,然后处理,还要考虑变态数据
10687 Monitoring the Amazon 图算法 根据最近原则构造邻接表(不用开方),然后就是搜索
10688 The Poor Giant 动态规划 可以根据n,n递推得到n^3的算法,更可以用n,k递推得到不依赖数据的n^2*k算法,利用单调性范围可以继续减到1s以内
10689 Yet Another Number Sequence 动态规划 注意到F(n)=f(n-1)*b+f(n)*b,首先预处理fibonacci数列,还有一种矩阵乘法可以使用。
10690 Expression Again 动态规划 典型的分数算法,但要注意优化,选择较小数,再算出所有可能值以后枚举即可。可以+50预处理
10691 Sub Way 几何+贪心 将每个点预处理,算出对其的可达角度范围,并排序(要注意去掉能包含原点的点),然后贪心选择
10692 Huge Mode 递归+数学 将最外层的取余,递归为内层取余,每一层要考虑循环长度与循环起点。
10693 Traffic Volume 数学分析 求导,求极值sqrt(2*L*F) 与 sqrt(F/2/L)
10694 Combinatorial Summation 组合数学 可以找规律,前面的数分别是0 1 7 14 26 46 79 … 仔细观察fibonacci数列有关,然后大数计算。
10695 Find the Point 计算几何
10696 f91 数学 找规律,或者动态规划
10697 Fireman barracks 计算几何 求三点的中点
10698 Football Sort 模拟排序 注意格式
10699 Count the factors 数论 预处理所有素数
10700 Camel Trading 动态规划 非常典型的类似于矩阵乘法
10701 Pre, in and post 图论 其实只是找到规律,比较几个值就可以了,但是挺有启发性的
10702 Travelling Salesman
10703 Free Spots 模拟 建立数组,模拟覆盖
10704 Traffic!
10705 The Fun Number System 模拟+数学 从低位到高位处理,注意其中的正负关系,同时注意到余数不为零的不变性
10706 Number Sequence 枚举+剪枝 枚举不同状态,即前两个点的分割位置。以此类推。
10707 2-D Nim 模拟 首先扫描出各种类型的区域,然后将其保存成一个字符串。它可以有8种形式,保存值最最大的,最后比较即可
10708 Cheetah 计算几何 构造出三角形,求三边长
10709 Intersection is not that Easy 计算几何
10710 Chinese Shuffle 群论
10711 Stitching 动态规划 分两种情况,一种是向上,一种是向下,任一种情况都要平移旋转赋值。最后比较最优者。
10712 Count the Numbers 数学
10739 String to Palindrome 动态规划 O(n^2)的复杂度
10740 Not the Best 图算法 第二最小生成树,每次去掉最小生成树种的一条边,然后找到一个构成连通
10741 Magic Cube
10742 New Rule in Euphomia 数学 预处理质数,本文求的就是将一个数分为两个和比他小的质数的分法,也可以开个加速数组
10743 Blocks On Blocks
10744 The Optimal Super Highway 数学 求距离排序的中间点
10745 Dominant Strings 枚举 枚举各种情况,之前可以将点转化成数字,利用整除
10746 Crime Wave - The Sequel
10747 Maximum Subsequence 数学 两种排序,一种是绝对值,一种是大小
10748 Knights Roaming 预处理+排序 预处理50步情况,然后对各个点枚举,排序,去掉重复的
附录3:(joj题目分类)
被删除:)
JLU.jojer.fennec
--
只管走过去,不必逗留着采了花朵来保存,因为一路上花朵自会继续开放的。
Do not linger to gather flowers to keep them, but walk on,
for flowers will keep themselves blooming all your way.
有一条小路,穿过田野,通向新南盖特,我经常独自一人到那里去看落日,
并想到自杀。然而,我终于不曾自杀,因为我想更多的了解数学。
——B.Russell
※ 来源:.吉林大学牡丹园站 bbs.jlu.edu.cn [FROM: 10.60.26.*]