随笔分类 -  基本算法

摘要:题意:给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形..问最多可以拿走多少个正方形..思路: 先找出可以组成正方形的地雷组合cnt个.. 然后st = 1 7 #include 8 #include 9 using namespace std;10 11 struct Point12 {13 int x;14 int y;15 }p[30];16 17 struct Set18 {19 Point p[4];20 int sta;21 }s[200];22 23 int cnt, tmp;24 int ... 阅读全文
posted @ 2013-12-12 14:13 Griselda. 阅读(333) 评论(0) 推荐(0)
摘要:题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和。 输入 iCase n 表示iCase个样例n个工厂 m1 p1 b1 p2 b2..pm1 bm1 //第一个工厂有m1个同种类不同参数的产品,每一个产品的参数分别是p1 b1 p2 b2 m2 p1 b1 p2 b2..pm2 bm2 ... mn p1 b1 p2 b2..pmn bmn 思路: 排序,先把b从小到大排序,然后把p从小到大排序,最后让第几个工厂的序号从小到大排序 排完后就可以直接... 阅读全文
posted @ 2013-08-11 14:05 Griselda. 阅读(417) 评论(0) 推荐(0)
摘要:题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样。 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反。思路: 都是暴搜枚举。 第一种方法:暴力dfs枚举 棋子只有最多翻一次,因为翻两次后结果和不翻是一样的,所以整个棋盘最多翻16次。 用step代表翻转的次数,当翻转了step次时,就看一下整个棋盘是否是清一色的。 当棋盘是清一色的时候就直接输出step,得到的就是最少翻转次数使棋盘清一色。 第二种方法:利用位运算来优化 因为棋子不是白就是黑,所以可以用0和1来表示。 然后为每一个棋子... 阅读全文
posted @ 2013-07-16 10:57 Griselda. 阅读(1035) 评论(0) 推荐(0)
摘要:题意: 给出一串已加密的报文,报文的原内容是由这串密码和某一个大写字母异或而来的。 已知这串报文仅由大写字母组成,请输出原报文思路: 水题,枚举A~Z 如果加密报文的每一个大写字母和当前枚举的字母异或后在合法范围内,即都是大写字母,则该字母就是keyword..Tips: ---***这里是重点***-- ①. 规律,a^b = c --> a^c = b & b^c = a ②. 两个整型异或的结果不是整型,需要强制转换..Code: 1 #include <stdio.h> 2 #include <cstring> 3 4 int main() 5 { 阅读全文
posted @ 2013-06-06 20:29 Griselda. 阅读(332) 评论(0) 推荐(0)
摘要:题意: 给出一个n*n的矩阵和m个数,从m个数中选几个数填入矩阵中值为0的空格中,使矩阵的和最大。 矩阵的和的定义是:所有子矩阵的数的和的和..思路: 要想矩阵的和最大..应该使m个数中值大的数填入矩阵中出现次数多的0格中.. 所有其实可以看做是求解矩阵中每一个0格被子矩阵包含的次数.. 以前做过一道题是一维的成段更新..方法是:http://www.cnblogs.com/Griselda/archive/2012/09/15/2686074.html 这道题类似..就是譬如要更新(x, y)到(x+k, y+k)的二维矩阵.. 就在(x, y)处设为1,在(x+k+1, y+... 阅读全文
posted @ 2013-05-08 20:15 Griselda. 阅读(278) 评论(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. 阅读(197) 评论(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. 阅读(282) 评论(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. 阅读(314) 评论(0) 推荐(0)
摘要:题意: 如果a的真因子之和 = b的真因子之和,则称a和b为亲合数,现在要找出100000以内的亲合数.. 要求不出现重复的数对..思路: 如果暴力找出100000以内所有数 (a) 的真因子和 (b) 然后看看这个和的真因子和(b)是否也等于这个数(a)..的话太暴力了..会tle.. 所以可以利用 num = p0^a0*p1^a1*p2^a2...pn^an..即任何一个数都可以看作是素数 pi的n次幂 乘以一个数.. 所以pi的0次幂到n次幂*pj的0~n次幂*..都是num的真因子.. 所以就是for循环找出所有的数的倍数加入到sum里面..Tips: 这个真真吃了me... 阅读全文
posted @ 2012-11-14 08:58 Griselda. 阅读(463) 评论(0) 推荐(0)
摘要:题意: Description 给出一个数x,让你计算级数: 1 + x - x^2/2! + x^3/3! - x^4/4! +... (-1)^(n+1) * x^n/n! 其中a^b表示a的b次方。 Input: 有多组测试数据,对于每组测试,仅包含一个数x。x可能为小数。(-20<=x<=20) 输入到文件结束。 Output: 对于每组测试数据,输出一行,包含一个小数,精确到10-8。 simple input: 1 2 simple output: 1.6321205... 阅读全文
posted @ 2012-11-12 21:47 Griselda. 阅读(229) 评论(0) 推荐(0)
摘要:题意:有童鞋A 和 童鞋BA想用手里的牌尽量多地覆盖掉B手中的牌..给出了T表示有T组样例..每组样例给出一个n 表示A和B手中都有n张牌接下来2*n行 有h w 分别代表A手中n张牌的高和宽 以及 B手中n张牌的高和宽问A手中的牌最多能覆盖B多少张牌思路:对一个坐标排序假设是x坐标然后扫描维护一个y坐标然后每次取的是堆里面最大的Tips:set里的一个函数..在短时间内找到 b的w 中满足小于a的w的值~iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。iterator upper_bou 阅读全文
posted @ 2012-09-09 09:34 Griselda. 阅读(309) 评论(0) 推荐(0)
摘要:题意:给一串数字长度n 和 取值长度范围m还有这串数字..a0, a1, a2, a3, ..., an求这串数字中在 长度范围m 内和sum 最大的..思路:从1~n 遍历每一个数..当前数字串和S(i) - 以前数字串和中的最小那个S(i-k){1 < k <m}<以前数字串的‘以前’范围是取值长度范围>‘以前数字串和中的最小那个’可以用 单调队列que 来控制..取遍历结果中最小那个..Tips:主要讲一下什么是单调队列..单调队列..顾名思义就是 单调增或减的队列..它存的值是对应 和数组s 里的下标..其中队头元素是 队列s 最大值或最小值的下标..但是其实这 阅读全文
posted @ 2012-08-10 18:51 Griselda. 阅读(829) 评论(0) 推荐(0)
摘要:主要是两种贪心+二分的方法..可以看作是入门题..牛..题意:输入:L(河的长度l) N(河上有n个石子) M(可以移动的最多的石子数m)往下n行表示河上的石子离左河岸的距离输出:所有 移动了m个石子后最短距离 的最大值..思想..其实牛可以跳的距离就在最大就是河的长度..所以可以用二分的方法看看小于河的长度内可以跳的最大长度..***贪心通常用一个check()函数来判断***check()判断每一个點到上一个點的距离是否小于假定的最短距离的最大值..如果是就count加1..如果不是就把上一个點的坐标替换成当前點坐标..最后判断是不是在m内..*********************** 阅读全文
posted @ 2012-07-13 22:11 Griselda. 阅读(185) 评论(0) 推荐(0)