08 2012 档案

摘要:题意:给出n2个队伍,pij 表示队伍i能赢队伍j的概率,给出一个n2*n2个概率矩阵,让你求出最后总赢的可能性最大的队伍。思路:除了给出的矩阵里的数为double,这就是一个典型的dp题,不过中间要用到位运算,呃,这个真的好难理解。举个例子来说吧,n = 3 。(1) 1 2 3 4 5 6 7 8 (假设这一轮比赛后,获胜的队伍为 1 , 3 , 5 , 7 )(2) 1 3 5 7 (假设这一轮比赛后获胜的队伍是 1 , 5 )(3) 1 5 (这一轮比赛后获胜的队伍只能是 1 或 5 )所以,要想得出最后获胜的队伍,要比n轮,dp[i][j] 表示第i轮j获胜的概率,则,在第一轮... 阅读全文
posted @ 2012-08-20 21:16 Misty_1 阅读(145) 评论(0) 推荐(0) 编辑
摘要:题意:p strat end ,表示员工i开始工作的星期,以及被解雇的星期,和在这期间他共加工了p种首饰,下一行是他都加工了哪几种首饰,问你通过这些记录是否能得出加工每种首饰需要多少天。思路:典型的高斯消元,设每种首饰需要的天数为xi,这个的每个记录就是一个方程,所以用高斯消元法解这个方程组就可以了,需要注意的是,他给出的是一个星期中的某一天,但他做了几个星期不知道,a1*x1 + a2 * x2 + .....=( b + 7 * x ) % 7 ;在本题中要注意%7 ,嗯,每个地方都要摸,不能超出7。代码:View Code #include <stdio.h>#include 阅读全文
posted @ 2012-08-20 11:09 Misty_1 阅读(149) 评论(0) 推荐(0) 编辑
摘要:题意:有一串数字,要将它排列成升序,每次可以交换两个数,交换一次的代价为两数之和。要求代价最小。思路:读完题,没有思路,知道是关于polya的,但是也只会最简单的求有多少种染色方法,然后上网搜题解,再然后参考大神的题解,终于明白了,还是要继续学习polya啊,大神的博客:http://www.cnblogs.com/mcflurry/archive/2012/06/21/2557798.html代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <i 阅读全文
posted @ 2012-08-18 20:19 Misty_1 阅读(173) 评论(0) 推荐(0) 编辑
摘要:关于polya的定义网上可以搜到很多,我所了解的也是从网上搜到的,不过可以介绍几个博客,个人觉得讲的还不错。1、关于polya的定义,http://blog.csdn.net/geniusluzh/article/details/67954122、将这两道题的,http://yzmduncan.iteye.com/blog/1402942如果还不懂得话,推荐看一下吴文虎的《组合数学》里的置换群那一节,对于求循环节很有帮助。1286代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h 阅读全文
posted @ 2012-08-18 19:35 Misty_1 阅读(394) 评论(0) 推荐(0) 编辑
摘要:题意:将1到N个数全排列,找出最长上升子序列和最长下降子序列中的较小值,并按字典序输出这个排列。思路:其实这题真没什么具体方法,如果你的逻辑思维能力较好的话,可以很轻松想出来,不过我是看了题解才明白的,如果N是一个平方数,例如9, 1 , 2 , 3 , 4 , 5 , 6 , 7 ,8 , 9它的答案是:3 ,2 , 1 , 6 , 5 , 4,9 , 8 ,7 ,即将序列分成sqrt(n) 段,然后每段都倒序,这样最小的值就是3 ,如果不是平方数,可以分两种情况,m = ceil(sqrt(n)) ;一种是(m-1)*m <n ,一种是(m-1)*m >= n 。呃,怎么解释这 阅读全文
posted @ 2012-08-17 16:07 Misty_1 阅读(329) 评论(3) 推荐(0) 编辑
摘要:题意:给出N*N个矩形,分成n*n个小矩形,然后给出M种颜色,每个小矩形可以涂一种颜色,并且有些小矩形已经涂完颜色,要保证这个大矩形无论是旋转还是反转都要保持不变,问有多少种染色方式。思路:中心对称图形,呃,其实找到有多少个小矩形可以然不同的颜色但又能保持是中心对称图形就基本上解决了这道题,找这些小矩形也很简单,是看了标程给出的公式才想到的,就是每个大矩形的左上角的那些小矩形。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream&g 阅读全文
posted @ 2012-08-17 10:40 Misty_1 阅读(177) 评论(0) 推荐(0) 编辑
摘要:题意:在M分钟里,每分钟会出现N颗龙珠,每颗龙珠的位置有题目给出,并且取走每个龙珠所消耗的能量也给出,同时在路上消耗的能量石|x1-x2|,如果在每分钟出现的龙珠里取一颗,问消耗能量最小是多少。思路:在比赛的时候就知道要有dp过,不过如果是不加优化的dp会超时的,所以要优化一下。先来推一下dp的状态转移公式。设dp[i][j]表示第i批龙珠中取第j个需要花费的最小体力。dp[i][j] = min{ dp[i-1][k] + abs(pos[i-1][k]-pos[i][j]) } + cost[i][j];如果直接用这个状态转移公式的,时间复杂度是:m*n*n,优化的话,如果每一个状态都看成 阅读全文
posted @ 2012-08-17 10:05 Misty_1 阅读(245) 评论(0) 推荐(0) 编辑
摘要:无奈了,只是用cout输出了两个回车,结果一个超时,一个竟然只用了100+ms,很无语~~题意:已知矩阵A:2 3 1 1 1 2 3 1 1 1 2 3 3 1 1 2已知矩阵B(8位16进制表示)。求A*B得到的新矩阵。思路:呃,这题中的加法是定义为异或运算的,没读题,只是听XH说了一下题意就开始做了,悲剧的是怎么都不对,然后又问了一下XH题意。。。。。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#i... 阅读全文
posted @ 2012-08-15 11:12 Misty_1 阅读(167) 评论(0) 推荐(0) 编辑
摘要:树形dp,顾名思义,就是在“树”的结构下用动态规划求最值。既然是在“树”形的结构下进行的,那么做这类题的第一步是先建树,然后顺着树的结构进行dp,一般从两个方向进行:1. 根—>叶:不过这种动态规划在实际的问题中运用的不多,也没有比较明显的例题。2. 叶->根:既根的子节点传递有用的信息给根,完后根得出最优解的过程。至于状态转移公式,这要具体题目具体分析。呃,来说说这道题。题意:各处含有N个节点的树,问你最少剪去几个边可以得到一颗包含P个节点的子树。思路:dp[i][j]表示以i为根的子树包含j个节点最少剪去的边,若j为1的话dp[i][1] 就等于i的子节点数,然后就是0-1背包 阅读全文
posted @ 2012-08-13 19:51 Misty_1 阅读(296) 评论(0) 推荐(0) 编辑
摘要:以前做过一道给定高度,然后给出长度让你求拼凑的方法的题,记得是到递推的题,如果这题不是在dp的训练计划里,我一定会耐心的去推公式的。呃,汗.......好吧,来说说这题吧。题意:给出矩形的长和高,然后让你计算用1*2或2*1的小矩形拼凑这个矩形,共有多少种方法?思路:刚才说了,开始我是想推公式来着,然后看了discuss了的一些讨论,才有了点想法,不过思路不是自己的,就不写了,个人觉得,下面这篇日志里讲的就很详细了~http://blog.csdn.net/wmn_wmn/article/details/7773167不过我觉得这题难的不是思路,而是关于二进制位运算的部分,如果不是很了解位运算 阅读全文
posted @ 2012-08-13 15:09 Misty_1 阅读(172) 评论(0) 推荐(0) 编辑
摘要:呃, 水题一枚,暴力就可以轻松过,但是还是想通过这种水题来让自己熟悉一下学过的算法,于是用了几种方法完成,呵呵,收获还是很多的~1、暴力过了一下,1A,呃,这个代码就不贴了,自认为代码写的还是很烂的,跑了16ms。2、二维树状数组。通过它终于弄明白二维树状数组是怎样求区间和的了。s[i][j] 表示从( 1 , 1 )->( i , j )的和,则要求( xi , yi )->( xj , yj )矩形的和话,则要表示为s[xj][yj] + s[xi-1][yi-1] - s[xi-1][yj] - s[xj][yi-1] ,其实一画图就能明白的,代码:View Code #in 阅读全文
posted @ 2012-08-11 16:38 Misty_1 阅读(158) 评论(0) 推荐(0) 编辑
摘要:题意:给出两个数N和K,让你改变N中的某些数,找到一个数M,是的M%k== 0 ,并且找到的M要尽可能小。思路:呃,其实我真的不擅长搜索,特别是搜,不过这题还是学到了很多东西。首先是一种大整数取模的方法。其实是参考着这篇解题报告学会的,http://blog.csdn.net/lyy289065406/article/details/6698787对于这题,他讲的很详细,我也是参考他的思路,所以就不说了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include 阅读全文
posted @ 2012-08-11 10:20 Misty_1 阅读(206) 评论(0) 推荐(0) 编辑
摘要:呃,有好久没写博了,很无奈呢,每次做完题总是会忘了这最后一步。。。。这题是上次比赛的一道题,比赛中就认为这题有技巧,其实在比赛中XH就找到了结论,但是由于当时我们俩都没接触过快速判素和快速求质因子的方法,也就是Miller_Rabbin和Pollard_Rho方法,所以尝试了几次打表,结果没过,然后就不了了之了。赛后看了解题报告,知道思路没错,有用打表的方法做了两遍,还是原样,题解中说用到了Pallard_Rab求质因子,所以就上网搜搜了,然后直到今天才做这题。题意:求出N的所有因子,然后选出尽可能多的元素,是的选出的元素两两互质,求出最长的长度和这些元素的最大和。思路:为了尽可能多的选出,每 阅读全文
posted @ 2012-08-10 21:17 Misty_1 阅读(271) 评论(0) 推荐(0) 编辑
摘要:题意:有N个城市M条路相连,有两种收费方式,一种是在城市Ci时收费为Pi,另一种是在城市Bi中Ri,求从城市1到城市N的最小花费。其中Pi要小于Ri。思路:其实我觉得这就是一道变形的最短路问题,虽然是用的深搜,但原理是一样的。首先将于城市Ai相连的城市都存起来,然后用一个数组记录城市I是否被访问过,如果访问过,当然可以直接在城市I缴费,原以为每个点访问一次就行了,可是后来想一想,不是这样的,要是这样的就没法提前在Ci城市缴费了,后来在网上看到有人是“闸数”,也就是一个点最多不会被访问超过3次,否则就退出,然后就按这个方法来做的~代码:View Code #include <stdio.h 阅读全文
posted @ 2012-08-08 19:59 Misty_1 阅读(151) 评论(0) 推荐(0) 编辑
摘要:先说一下我了解的压缩状态dp吧。经典的压缩dp问题是TSP问题:一个n个点的带权的有向图,求一条路径,使得这条路经过每个点恰好一次,并且路径上边的权值和最小(或者最大)。或者求一条具有这样性质的回路。压缩dp问题中存储点集是利用二进制形式,比如 3 = 0000,0000,0000,0011 表示第一个和第二个点在点集中,5 = 0000,0000,0000,0101 表示第一个和第三个点在点集中,以此类推。呃,简单来说,就是用一个数表示一种状态,一般n<= 16 或n <= 32 。状态转移:如果状态存在,dp[i][j] = 0 ,否则为无穷大.1、状态存在:dp[i][j] 阅读全文
posted @ 2012-08-08 11:31 Misty_1 阅读(266) 评论(0) 推荐(0) 编辑
摘要:题意:给出N个星星的坐标,level[x]表示在当前节点左下方的星星的个数,然后让你输出level[0] . level[1] .....的值。星星的坐标按y的升序给出。思路:简单线段树,每当给出一个坐标,在他所在区间就自加1,然后查到该节点,得出在左下方的星星数,就可以了。看代码吧,View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue> 阅读全文
posted @ 2012-08-06 16:21 Misty_1 阅读(132) 评论(0) 推荐(0) 编辑
摘要:题意:有N个点是连通的,现在给出Q个操作,D是破坏这个点,R是恢复最近被破坏的点,Q是询问与这个点相连的点的个数。思路:这题与上次比赛的最后一题有点相似,比赛的题是让求从该点往后的相同的字符的个数,而这题是求与这个点相连的点,包括前后。其实线段树也很好理解,节点设四个标记,最左端点,最右端点,从左端点开始,与左端点相连的点的个数,从右端点开始,与右端点相连的点的个数,随时更新,查询时是,先找到最左端相连的区间,然后不断向右找到不相连的点。呃, 还是看代码吧。代码:View Code #include <stdio.h>#include <stdlib.h>#includ 阅读全文
posted @ 2012-08-06 15:40 Misty_1 阅读(153) 评论(0) 推荐(0) 编辑
摘要:题意:N个数字,Q个操作,Q表示询问[s,t]中的数据和,C表示从s到t中的每个数据都加上x;思路:简单的线段树,把每一段放入和存入结构体中,但是如果每次更新都更新到叶子节点的话,会超时,因此在结构体中加入一个标记,记录每个区间的增加量,这样不用再更新到叶子节点,当查询的时候加上即可。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue& 阅读全文
posted @ 2012-08-06 15:11 Misty_1 阅读(153) 评论(0) 推荐(0) 编辑
摘要:题意:给出一个非降序的数组,给出Q个询问,每个询问给出起点和终点,问在这个区间中出现频率最多的数字的次数。思路:这题可以用线段树,不过最近在学RMQ,所以用ST做的。这题的难点在于初始化,初始化后直接套模板就行了,来说说初始化吧。一个区间会出现三种情况:1、1111111111111,整个区间都被同一个数字占据,那么直接返回(r-l+1)就行了,2、1111122222222,整个区间只由开始和结尾两种数字组成,这种情况返回两者中较大的。3、11111222233333,区间中除了两头的数字还有其他数字,那么就用ST求出最大值就行了。对于每个数字出现的次数,用两个数组来存,一个数组存到目前为止 阅读全文
posted @ 2012-08-06 14:47 Misty_1 阅读(174) 评论(0) 推荐(0) 编辑
摘要:好几天没写博,还是没形成习惯啊,最近都在做线段树和树状数组方面的题,树状数组和线段树有一些相似的地方,有些题既能用线段树又能用树状数组,所以就都先用一下,不过还是不熟练。那好吧,几天补齐前几天的博。题意:给出N个数字和Q个询问,每个询问给出起始位置和终止位置,求出这段区间中最大数字和最小数字的差。思路:RMQ的思想就是求一个区间中的最值,用ST求出区间最大值和最小值,然后求差。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream&g 阅读全文
posted @ 2012-08-06 14:31 Misty_1 阅读(166) 评论(0) 推荐(0) 编辑
摘要:第四场比赛早就做完了,就是一直没写总结,感觉这次的题出的真的不好,后台测试数据的强弱就不说了,因为我们也没做出几道题,但是就给出的标准输出都是错的这一点来说真的不怎么样。还有感觉这次的题偏重于数学类的,让人摸不透出题人到底是想考察什么的,晕啊~这次比赛我们队共做出三题吧,最后那题还是ZJH随手写的,以为一定会超时的,在最后两分钟提交的,唉,这能说什么呢,RP吧~说说第四题吧,题意是给出一个人5*N的矩阵,让你从矩阵的每行去一个数,是的这五个数的和0,N为200 ,刚开始的时候,ZJH用二分查找做的,怎么样都过不了,后来想想或许Hash查找会快一点,然后改用Hash做的。代码:View Code 阅读全文
posted @ 2012-08-06 11:26 Misty_1 阅读(197) 评论(0) 推荐(0) 编辑
摘要:呃,先说一下比赛是的情况,我们是分开读题的,我负责从后面开始读,读完最后一题,感觉在poj上见过一道相似的题,那是一道复杂模拟,当时觉得这题应该也是道模拟题,但是自己的代码能力实在太差,所以决定在ZJH做完后给他说下题意,但没想到直到最后这题也没人过,所以也就没说。然后是倒数第二题,这题让我不得不再次正视自己的英语,唉,明明知道这题就是根据给出的公式进行计算,但就是没看到p(r)是怎么定义的,失败啊,过后看了解题报告,果然如此~再然后是第三题,没来得及细看,XH就让我读一下第一题,看了一下第一题过的人挺多,但是最后我们都没能过掉,题意倒是读懂了,可是没有思路啊,再然后,看到1005 、1006 阅读全文
posted @ 2012-08-01 21:02 Misty_1 阅读(186) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示