http://acm.zjut.edu.cn/ShowContestProblem.aspx?ShowID=1010&MID=361
首先祝贺老吕获得第六的好成绩,然后他推荐我做下这个题目。
他是模拟STL函数next_permutation(num,num+n)实现的代码。【点击进入】
于是我也去做了下。(我不能提交,代码正确性还没证明)
对于这种找第几个,而且是有序的队列的题目,我首先蹦出的思想就是二分。仔细想想,这个题目二分可行,而且是这样分的:我们算在mid这个数字时,比它小的有几个。算这个有几个的时候就是用排列组合的知识了。
在算比它小有几个的时候,从高位往低位用i枚举,每位有这么几种情况:
- for(i = 1; i <= n; i++)
- {
- if(a[i] > 0 && a[i] <= n)
- {
- ans += docan(a[i], b) * nt(n - i);
- if(b[a[i]] == 1) return (ans == m) ? (ans + 1) : ans;
- b[a[i]] = 1;
- }
- else
- if(a[i] == 0) return (ans == m) ? (ans + 1) : ans;
- else
- if(a[i] > n)
- {
- ans += docan(n + 1, b) * nt(n - i);
- return (ans == m) ? (ans + 1) : ans;
- }
- }
①当这位的数a[i]在1跟n之间时,也就是说,这个数字是组成排列数所需的数字时,比它小的数有这位数在(1~a[i]-1)能选的数字乘以下一位的阶乘。比如7250000的第三位是5,那么这位在(1~4)能取的是1、3、4三个,那么比它小的有3*4!。并且如果这位数在之前出现过(我们每枚举一位,就把b[a[i]]记为1以表示这个数已经出现过了),那么可以跳出枚举返回答案了。
②当这位数等于0的时候,就直接返回答案了。因为再枚举下去都没意义了。
③当这位数大于n时,就是说它能取的范围是(1~n)之间能取的数,也就是说比它小的有(1~n)之间能取的数乘以下一位的阶乘。然后就可以跳出枚举返回答案了。
在以上几种情况返回的时候我们要判断下ans是不是已经等于m了,如果等于m,我们就要把ans值加1。举个例子,因为这个ans里包括了最终的答案的那个数。就这样返回的话,输出的就是现在这个数而不是最终的答案了。举个例子,如果最终的答案是34152,那么比34157小的数的个数刚好就是m。
④最后还有一种情况,就是当位枚举完了还没返回值,也就是说这个数的各位数全部由无重复的1~n中的数组成,那么别忘了把这个数的本身加回去再返回。
最后贴上代码
今天在ACM群里看到一个人发了一段树状数组的代码。我就瞅着Lowbit眼熟,好一段时间才想起来这是树状数组。
好久没玩算法了,都忘了!兄弟们都忘了!
忘了就忘了吧,我记得以前学树状数组这个东西是在一个PPT里看的,貌似还在空间里,于是就去找了,最后还发现了这么个宝库。嗯,应该可以把以前丢掉的东西重新都捡回来了吧。
颓废了颓废了,该改改了。要好好复习算法。嗯,今天高数还认真,都坐第一排去了。
顺便学学Matrix67大牛,做个适合自己的Cheat Sheet,好好背,好好学。

看着悲惨的分数,我纠结了。
想想前段时间太不认真了,整天忙工作,在程峰的“谆谆教导”的数学课上昏昏欲睡,导致了现在的结果。
事实证明,大学大学,还是要学的。所以接下来该有所行动了。嗯,12月19,也就是我生日那天,要考四级了,我现在要做充分准备。我觉得把电脑带到学校就是个错误,不过既带之则安之,不如好好利用起来。荒废太久了。
今天开始要重新阅读大牛们的博客,然后看算法、做题目。海报什么之类的尽量少做,少而精才是王道的。
话说磊哥让我立下军令状让我期末高数考90分以上,真要把书啃上几遍了。至少像我现在这样上课没很认真,复习也没很认真是不行的。
还有每节课都要认真听了,包括那什么让我有点无语的C语言、计算机科学与技术方法论啊什么的。
话说那方法论还挺高级的,树啊、图论啊什么的都有,可惜都是涉及不深。说实话我还是对算法比较感兴趣的,不过为了我的学业,还是都要学的。
幸好班主任还有英语老师对我的印象很不错。我想只要把成绩提上来一切都会好起来的。
也罢,学校拉风也拉够了,要静下心来了。
嗯,跟室友们说好,好好努力,营造一个OK的学习环境。
http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1307
数据范围不大,所以搜索足矣解决。开个n*n的数组来存每一台电脑各与那几台电脑连通,然后用深度优先搜索,把与此电脑连通的电脑都标记为vis。最后计算有几个独立的块,网线就是块数-1。
接下来是代码
这位用户的签名
I am the bone of codemachine.
吾身为代码机器
Code is my body, and algorithm is my blood.
字符成身,算法为血
I have created over a thousand program.
铸程过千,身经百战
Unknown to fail, Nor known to win.
未有败绩,也未有成功
Have withcode world to create many codes.
常独自一人沉醉于编程世界
Yet, those hands will never hold anything.
因此,一无所有,一无所获
So as I pray, unlimited code works.
故我所求,无限代码制






