iDesignV9.8003

Dec 6

http://acm.zjut.edu.cn/ShowContestProblem.aspx?ShowID=1010&MID=361

首先祝贺老吕获得第六的好成绩,然后他推荐我做下这个题目。

他是模拟STL函数next_permutation(num,num+n)实现的代码。【点击进入

于是我也去做了下。(我不能提交,代码正确性还没证明

对于这种找第几个,而且是有序的队列的题目,我首先蹦出的思想就是二分。仔细想想,这个题目二分可行,而且是这样分的:我们算在mid这个数字时,比它小的有几个。算这个有几个的时候就是用排列组合的知识了。

在算比它小有几个的时候,从高位往低位用i枚举,每位有这么几种情况:

折叠C/C++ 代码复制内容到剪贴板
  1. for(i = 1; i <= n; i++)   
  2. {   
  3.     if(a[i] > 0 && a[i] <= n)   
  4.     {   
  5.         ans += docan(a[i], b) * nt(n - i);   
  6.         if(b[a[i]] == 1) return (ans == m) ? (ans + 1) : ans;   
  7.         b[a[i]] = 1;   
  8.     }   
  9.     else  
  10.     if(a[i] == 0) return (ans == m) ? (ans + 1) : ans;   
  11.     else  
  12.     if(a[i] > n)   
  13.     {   
  14.         ans += docan(n + 1, b) * nt(n - i);   
  15.         return (ans == m) ? (ans + 1) : ans;   
  16.     }   
  17. }  
  •  

 

①当这位的数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中的数组成,那么别忘了把这个数的本身加回去再返回。

最后贴上代码

Dec 2

今天在ACM群里看到一个人发了一段树状数组的代码。我就瞅着Lowbit眼熟,好一段时间才想起来这是树状数组。

好久没玩算法了,都忘了!兄弟们都忘了!

忘了就忘了吧,我记得以前学树状数组这个东西是在一个PPT里看的,貌似还在空间里,于是就去找了,最后还发现了这么个宝库。嗯,应该可以把以前丢掉的东西重新都捡回来了吧。

颓废了颓废了,该改改了。要好好复习算法。嗯,今天高数还认真,都坐第一排去了。

顺便学学Matrix67大牛,做个适合自己的Cheat Sheet,好好背,好好学。

Dec 1

期中高数挂了 不指定

Jucady , 15:30 , Mood , 评论(0) , 引用(0) , 阅读(67) , Via 本站原创

看着悲惨的分数,我纠结了。

想想前段时间太不认真了,整天忙工作,在程峰的“谆谆教导”的数学课上昏昏欲睡,导致了现在的结果。

事实证明,大学大学,还是要学的。所以接下来该有所行动了。嗯,12月19,也就是我生日那天,要考四级了,我现在要做充分准备。我觉得把电脑带到学校就是个错误,不过既带之则安之,不如好好利用起来。荒废太久了。

今天开始要重新阅读大牛们的博客,然后看算法、做题目。海报什么之类的尽量少做,少而精才是王道的。

话说磊哥让我立下军令状让我期末高数考90分以上,真要把书啃上几遍了。至少像我现在这样上课没很认真,复习也没很认真是不行的。

还有每节课都要认真听了,包括那什么让我有点无语的C语言、计算机科学与技术方法论啊什么的。

话说那方法论还挺高级的,树啊、图论啊什么的都有,可惜都是涉及不深。说实话我还是对算法比较感兴趣的,不过为了我的学业,还是都要学的。

幸好班主任还有英语老师对我的印象很不错。我想只要把成绩提上来一切都会好起来的。

也罢,学校拉风也拉够了,要静下心来了。

嗯,跟室友们说好,好好努力,营造一个OK的学习环境。

Nov 15

http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1307

数据范围不大,所以搜索足矣解决。开个n*n的数组来存每一台电脑各与那几台电脑连通,然后用深度优先搜索,把与此电脑连通的电脑都标记为vis。最后计算有几个独立的块,网线就是块数-1。

接下来是代码

Nov 15

jki14

这位用户的签名

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.
故我所求,无限代码制

分页: 1/5 第一页 1 2 3 4 5 下页 最后页 [ 显示模式: 摘要 | 列表 ]