上一页 1 2 3 4 5 6 7 8 ··· 12 下一页
摘要: 题意: 如下图所示,从上到下从左到右,给出3*3矩阵的数字摆放起始情况.. 输出最少经过几步可以把这个矩阵变成0123456789的形式..其中0表示空格.. 如果无法变成0123456789就输出NO.. 思路: 求最少几步可以变成0123456789一下子就想到了广搜.. 但是用广搜的时候会需要一个数组vis[]记录当前状态已经搜过了,不需要继续搜..但是用vis[0][1][2][3][4][5][6][7][8][9]这样的话会超内存.. 所以就用康拓展开来记录状态.. 康拓展开就是通过公式计算出该数在总序列里的序号.. 举个例子 123这个排列 有如下排... 阅读全文
posted @ 2013-04-25 21:59 Griselda. 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n个石头的重量和得分,有一个为m的背包,问在m个背包里能装的最大得分是多少,并要求输出装入的石子编号.. 如果有多个解则输出字典序最小的..思路: 这个在背包九讲后面有提及.. 主要是用一个二维数组path[i][j]表示当体积为j的时候第i件物品是否有被装入.. 最后用一次循环根据if(path[i][tv]) { ans[cnt++] = i; tv -= v[i]; } 就可以求出路径并保存在ans里面了..Tips: 注意找的时候应该是从i = n往前遍历.. 而输出的时候应该... 阅读全文
posted @ 2013-04-17 21:32 Griselda. 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n个数,求出改变某个数后能得到最长的严格上升子序列思路: 用一个数组pre[i]和suf[i]分别表示第i个数前的严格上升子序列有多长,第i个数后的严格上升子序列有多长 如果arr[i]的前一个数比后一个数起码小1的话..找出max(pre[i]+suf[i]+1),否则max(ans, max(suf[i]+1, pre[i]+1))Tips: 注意可能出现1 1 2 3 4 这样的情况,这时候就只能是4了..Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <al 阅读全文
posted @ 2013-04-09 21:41 Griselda. 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个文本串str 给出n个模板串arr 问有多少个模板串可以由文本串中的两段子串组成,且两段子串在文本串中的先后顺序不变。思路: 用两次KMP求出每个子串从第一个字符开始的第一个出现位置和从最后一个字符开始的第一个出现位置 即next[0][i]表示模板串中以i结尾的子串在文本串中第一次出现的位置,next[1][i]表示模板串中以i开始到最后的子串在文本串中最后一次出现的位置 然后看一下是否有next[0][i]<next[1][i+1]的情况存在.. 如果有代表这个模板串可以在文本串中找到符合要求的情况。Tips: ①. 用另外一个字符串来记录翻转的串的时候,要... 阅读全文
posted @ 2013-03-23 10:31 Griselda. 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题意: 求1~n以内的无平方因子数的个数。思路: 利用类似筛选法把100010的素数标记出来(预处理) 然后通过容斥原理,把有平方因子数的个数算出来,那总个数-有平方因子个数 = 答案了 n之内有平方因子的数的个数sum =n/(2^2) + n/(3^2)+……+n/(k^2) - n/(2^2 * 3^2)-……+……。Tips: 所谓容斥原理,其实举一个简单的例子就是:一个班里a个同学喜欢吃苹果,b个同学喜欢吃香蕉。问这个班有多少个同学。 如果自己算的话就是a + b - a∩b 这题也一样,把含2的k次方的个数算出来,含3的k次方的个数算出来,含5的k次方的个数算出来,含... 阅读全文
posted @ 2013-03-17 09:46 Griselda. 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n个数,让你用最少次数把所有的数都摞成一堆。 其中当把arr[i]摞在第j堆上时,得扣分arr[i] 题目有要求每个数上面不许摞超过k次,有m个k,让你求出m种情况下限制为k时的最优解,即最少扣分。思路: 经过多次推算会发现,如果要最后扣分最少,则应该尽量让arr[i]小的摞的次数比较多,而arr[i]大的摞的次数比较少。 然后还有一个规律是,如果想让扣分最少,那每次应该尽量让值大的堆上摞的次数比较多,本身则尽量少摞。即尽量满足 一次摞足够多的物品。Tips: 如果k = 1,则答案就是arr[1] + (arr[1]+arr[2]) + (arr[1]+arr[2]+... 阅读全文
posted @ 2013-03-17 08:44 Griselda. 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n个点的x坐标和y坐标,让你求出由其中三个点组成的三角形,要求这个三角形里面不包含别的点且面积最小。思路: 三角形里面不包含别的点的判断方法是最暴力的一层for循环用面积法看看除去组成这个三角形以外的别的点是否在这个三角形内。Tips: 这题的关键其实只是掌握面积法。即利用差积的方法求面积。Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <ctime> 阅读全文
posted @ 2013-03-16 21:24 Griselda. 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出n行m列的数组,并给出k个操作; 其中操作方法有三种: ① c x y 表示把数组的第x列和第y列交换 ② r x y 表示把数组的第x行和第y行交换 ③ g x y 表示求数组的第x行第y列的数思路: 用一个数组c 和 r表示第c行和第r列当前值是实际数组中的第几行第几列Tips: 因为n m k给的值都很大 所以如果按暴力模拟的话,即一个一个交换就会超时 所以想到用一个虚拟的数组保存当前数组的每一行每一列在原数组中的哪一行哪一列Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #incl 阅读全文
posted @ 2013-03-16 21:18 Griselda. 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 题意:给出n张牌的重量和现在剩下的牌的重量。求缺失了的牌。如果无解就输出0 多解就输出-1 否则就按照输入的顺序输出排的编号思路: 01背包.. 状态转移用dp[v] = cnt;表示牌的总和为v的情况是为cnt 记录路径有path[v] = j; 表示是加上了第j个物品才得到体积为v的。 一开始有一个已知的是dp[0] = 1; 状态转移方程为 if(dp[j-w[i]])dp[j] += dp[j-w[i]]; 表示当前一个状态存在的情况下,这一个状态的情况数为前一个状态加上当前这个状态的情况数。 因为题目要求给出缺失的牌的编号,所以如果dp[j] == 0,即第一次遇到这个情... 阅读全文
posted @ 2013-03-16 21:08 Griselda. 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出每一秒降落的蚊子坐标~ 给你一个蚊拍.. 如果一下子拍死n只那就能得n*n的分~ 问最高能得多少分~ 输入: 一个t n 表示t秒n只蚊子 接下来t行每行给出n只蚊子的横纵坐标思路: 因为n<10 所以可以用状态DP来找~ dp[t][stat] 表示在第t次的stat状态下 eg:dp[2][4]表示在第二次4--> (0100)-->第3个位置有蚊子的状态下能够得到的分 先把所有情况都初始化为负无穷大.. 然后把dp[0][0~stat]都初始化0 因为落拍点的不同会导致拍到蚊子数的不同~ 即会存在偏移量~ 所以球拍落拍点... 阅读全文
posted @ 2013-02-11 13:21 Griselda. 阅读(275) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 12 下一页