- 博客(108)
- 资源 (2)
- 收藏
- 关注
原创 二分查找中的死循环
二分算法是我们经常会用到的一个算法。它是分治法的一个应用。不过,虽然他写起来貌似很简单,但是却很容易写错。下面我们讨论一下二分的死循环问题。(这里讨论的是整数的二分问题,浮点数的二分不容易死循环)1.查找的元素确定,值唯一或者不存在 这种情况等下,我们的流程分为三个分支:(相等、小于、大于)。这类不容易死循环,代码如下:if ( data[mid] ==......
2014-09-13 17:35:37 7221 4
原创 卡特兰数(Catalan UVa 991 10303 10007 1478)
一、介绍 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名。 历史上,清代数学家明安图(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔兰数”。 卡特兰序列的前11项为:1, 1, 2, 5,14, 42, 132, 429, 1430, 4862, 16796,。
2014-09-12 17:17:58 2213 2
原创 zoj 3034 - The Bridges of Kolsberg
题目:在河两端有两排服务器,现在要把河两边相同的品牌型号的机器连起来,每个电脑有个值, 每个机器只能与另一台机器链接,并且不同的链接不交叉,现在要求链接的电脑总之最大。分析:dp,最大公共子序列,字符串。还要加一个字符串处理。说明:(2011-09-19 11:08)。#include #include #include #define max( a,
2014-09-30 17:02:38 936
原创 zoj 2068 - Chopsticks
题目:很多人在一起吃饭,有两组单支的筷子,定义badness为一对筷子长度差的平方,求最小的badness和。分析:dp,最大公共子序列类似物。 这里利用数学关系找到一个结论: a 所以最优解一定不会交叉,然后先用元素少的串,求长串的LCS的即可; 权值计算用长度差的平方,而不是
2014-09-30 16:48:37 784
原创 UVa 750 - 8 Queens Chess Problem
题目:计算一定经过给定点的八皇后。分析:搜索。因为八皇后只有92组解,直接计算出92组解,然后查询输出即可。 这里我使用了位运算来计算八皇后,减少代码量。 先考虑一个皇后的影响,每次下一层攻击的点和上一次的关系如下: 一个皇后会影响自己下方和左右两个斜的方向(从上往下搜索); 向左的斜的
2014-09-30 16:12:59 4435
原创 UVa 10190 - Divide, But Not Quite Conquer!
题目:给你一个等比数列的首项和公比的倒数,如果尾项是1输出这个数列,否则输出Boring!。分析:数学题。按照题目要求数列是递减的,所以公比的倒数一定要大于1,即m > 1。 然后在附加一个条件n > m判断位数是否为1即可。说明:这种卡题意的题目好纠结╮(╯▽╰)╭。#include #include #include using namespac
2014-09-30 15:58:11 5851
原创 UVa 10170 - The Hotel with Infinite Rooms
题目:求从s开始的递增序列(每次加1),求出他们加和不小于D的那个最后的加数。分析:数学题,分治。s + s+1 + ... + n = n*(n+1)/2 - s*(s-1)/2 = (n+s)*(n-s+1)/2。 直接二分答案即可(二分范围0~10^8)。说明:(⊙_⊙)。#include #include using namespace st
2014-09-29 18:05:01 2356
原创 zoj 3017 - Extreme Gameplay
题目:最短路+DP 描述:用 M 个城堡,每个城堡有 N的连续的房间,每次 可以消耗一定的魔法在不同的城堡之间的同一编号的房间穿梭, 或者消耗一定的时间走向本城堡的下一个地点,求从 1号城堡 的 1号房间出发,到达任意第 N个房间的最小时间。 分析:典型的背包问题,每次以剩余的魔法值位容量背包(01比较
2014-09-28 23:52:04 596
原创 zoj 1880 - Tug of War
题目:二维01背包。分析:因为必须放在两个组中的一组,直接背包所有可到状态, 取出相差不超过 1的最接近 sum/2的值即可。 说明:430ms。。。好慢啊。。。 #include #include #include int f[ 52 ][ 22501 ];int h[ 101 ];int main(){ int n,sum;
2014-09-28 23:48:54 1011
原创 UVa 1330 - City Game
说明:注意数据读入格式。#include #include #include char Maps[1003][1003];int MaxH[1003][1003];int L[1003],R[1003];int MUQ[1003];int main(){ int t,m,n; while (~scanf("%d",&t)) while (t -
2014-09-27 21:36:38 838
原创 zoj 2042 - Divisibility
题目:给你一串数字,不改变数字的顺序而在他们之间加入减号或者加号,问结能否整除m。分析:dp,背包类似物。容量为0 ~ m-1。 状态:f(i,j)为前i个数组合结果的余数为j的真值; 转移:f(i,j)= max(f(i-1,j-a[i]),f(i-1),j+a[i]){ 结果对应值在0 ~ m-1之间 };说明:(2011-9-19
2014-09-27 19:14:34 998
原创 zoj 2250 - Grandpa is Famous
题目:统计排名第二的人。分析:计数排序+统计。说明:大黄都说题目木有问题。他怎么会放在DP分类里啊。(2011-11-01 15:19)#include #include #include #include usingnamespace std;int V[ 10005 ];int C[ 10005 ];int cmp( constvoid* a, constvoi
2014-09-27 09:36:10 1073
原创 zoj 2501 - A Mini Locomotive
题目:有一串数,从里面取出m个不同的区间,每个区间长度不能超过M,使得所取所有数字和最大。分析:dp,单调队列,区间最大字段和。因为数据都是正的不需要单调队列维护(否则要使用)。 区间最大字段和,求出每个元素作为结束标志的前k项和;取结束位置作为dp状态; 然后,利用单调队列维护区间长度,O(1)时间查找满足长度的最小的前j项和,做差即可。
2014-09-27 09:35:35 835
原创 zoj 1883 - Tight Words
题目:如果一个单词的每个字母都不相差1,我们称为紧密的,给你字母集合{0~k}, 问长度为n的单词是紧密的概率。分析:概率dp。以长度为阶段,结束位置的字符的概率为状态 dp。 状态:设f(i,j)为长度为i的单词,取自集合{ 0,..,k }的紧密概率; 转移:f(i,j)= (f(i-1,j-1)+ f(i
2014-09-27 09:00:55 1109 3
原创 zoj 2059 - The Twin Towers
题目:给你一些砖块,问你是否能罗列成2个高度相同的塔,每层一个石头。分析:dp,双塔问题。和LIS,背包等问题相同,前 i项的最优子问题。 状态:f(i,j)为前 i个材料,在两塔差的绝对值为j时的高塔(或者低塔)的高度; 决策:每次有 3种选择:放在高塔上,放在低塔上,或者不放; T = O( sum( h )*
2014-09-26 14:55:24 1051
原创 zoj 1503 - One Person "The Price is Right"
题目:有一个数字让你猜,你有k次机会,并且有k个保险如果猜的低了会高度你低了, 高了会告诉你高了,并且失去一k保险(k=0时猜高了就会失败),现在问你能猜的数字范围。分析:dp,二维动态规划。按保险k和猜的机会n递增的方向dp。 状态:f(G,L)为有G次猜的机会,L个保险时确定的数字范围(1~N); 转移方程:F(
2014-09-26 00:42:05 1153
原创 zoj 2527 - Series
题目:计算最长的等差数列长度。分析:dp,LIS类似物,二分。先排序,然后枚举前面的所有点作为前一个元素求公差即可。 更新时,利用二分找到,距离当前位置最近的前第二元素, 如果不存在,则直接更新为 2即可。 说明:如果数据范围小的话,可在连续区间dp(O(L^2))。(2011-10-03 17:34)#include #inclu
2014-09-26 00:25:07 1177
原创 zoj 2414 - Index of Prime
题目:判断一个数能不能写成素数的和的形式,输出对应的素数大小最小组合。分析:dp,多重背包。看到整数拆分就是背包了。 由于时间和数据的限制,所以采用打表计算; 每次记录上次使用的 prime然后逆向求解即可。说明:注意,没有时输出 0,由于没写 WA了好几次。。。(2011-10-03 18:37)#include #include
2014-09-26 00:13:19 980
原创 zoj 2271 - Chance to Encounter a Girl
题目:平面图上有一个女孩,她初始在(n/2,,n/2),每次可以走到上下左右四个格子中的一个, 她每次随机的走的动,你从(-1,n/2)向右移动,问你们相遇的概率。分析:概率dp。事件为阶段,每个点由上一阶段周围的四个点来维护。 分成角、边、和中间三种计算概率(分别为1/5,1/3,1/4); 关于概率的求解,如果遇
2014-09-24 01:02:34 1017
原创 UVa 662 - Fast Food
题目:一条街道上有n家餐馆,现在想建立k个仓库,储存代价是每个餐馆到最近的仓库的距离和; 求最小的储存代价。分析:dp,中位数,动态规划。 状态:f(i,j)表示前j家餐馆建立i个仓库的最小储存代价; 状态转移:f(i,j)= min(f(i-1,k)+ cost(k+1,j)){ 其中 i-1
2014-09-24 00:45:37 1777
原创 zoj 2811 - Playground
题目:有很多个半圆环,问能不能拼成闭合图形,这里可以任意角度端点拼接。分析:贪心。开始以为是搜索3^20觉得有点大,一看可以任意角度链接。 把range按递增序排序,每次检测前面的所有range的和是否大于当前的range; 如果前面的和大,则可以构成闭合图形;否则将它加入前面的集合,向下判断; 那么这种情况一定能取
2014-09-23 23:28:05 835
原创 zoj 1563 - Pearls
题目:有不同品质的珍珠,品量高的珍珠价钱高。买珍珠的价钱计算方式:(购买数量+10)×单价; 质量低的珍珠可以用质量高的珍珠替代,给出要买的珍珠类型和数量,求买完所有珍珠所要的最低价钱。分析:dp,贪心。每种珠宝 都是整体处理时才会有最小价格,即要么和比他贵的一起买,要么自己单独买。 按照价格递增的顺序dp,只有价格高的可以代替价格低的;
2014-09-23 22:50:19 1012
原创 hdu 2546 - 饭卡
题目:电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前, 卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负), 否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售, 每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡
2014-09-22 08:47:10 1391
原创 hdu 1176 - 免费馅饼
题目:接馅饼,天上掉馅饼,活会落在0~10,11个位置上,单位时间可以移动到相邻的格子里; 问最大能接到多少。分析:dp,离散化。 阶段:时间(离散化的); 状态:某时间站在当前点,能得到的最大值; 决策:按照时间计算前一位置可到达当前位置的区间来更新当前点;说明:初始化 5位置0,其
2014-09-22 08:35:00 1679
原创 hdu 1421 - 搬寝室
题目:搬寝室,每次最多拿两个物品,代价是量物品重量之差的平方,求最小代价。分析:dp,贪心。如果取两个物品,重物相邻时,差的平方最小。 证明:设 a (d-a)^2 + (c-b)^2 > (d-c)^2 + (b-a)^2; (d-b)^2 + (c-a)^2 >
2014-09-22 08:28:03 835
原创 hdu 2870 - Largest Submatrix
题目:统计一个字母矩阵中最大的相同字母的面积,有些字母可以换成其他字母。分析:dp,单调队列。计算分三种分别换成a,b,c求出最大的子矩阵,求出最大即可。 然后就是单调队列优化的查询算法了,确定每个点右(左)边第一个比他小的点; T(N)=O(N^2)。说明:(2011-09-19 08:15)。#include #include
2014-09-22 08:07:23 1121
原创 hdu 2830 - Matrix Swapping II
题目:求一个01矩阵中的最大有全是1的矩形面积,列可以任意互换。分析:dp。zoj2180类似题,计算前 K行的最大值时,先按高度排序即可。 这里利用单调队列优化了查询算法,即保存一个区间的最小高度维护即可; 最大的面积为max(最小高度*区间长度),T(N)= N^2 log(N)。说明:(2011-09-19 08:10)。#in
2014-09-22 07:54:57 828
SOFA: A Multi-Model Framework for Interactive Physical Simulation
2018-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人