第八章 高效算法设计(习题)
aozil_yang
这个作者很懒,什么都没留下…
展开
-
UVA - 11536 Smallest Sub-Array (滑动窗口)
大体题意:给你n,m,k 从而会算出一个n个元素的集合,求出一个子集合的长度,其中子集合 存在X 满足X 思路:建立一个vis数组,表示每个数出现的次数,然后一个一个数的遍历,只有满足当前数符合访问次数为1 并且大小小于等于k,则cnt++然后建立一个pos表示左端的最优解的位置 寻找方法很简单 当pos位置的数 vis 大于1 或者 大小大于k 都不是最优的都应该++原创 2016-05-24 01:04:01 · 466 阅读 · 0 评论 -
UVA 1611&& UVALive 6588 Crane (贪心思路)
大体题意:给你n 个数(1~n),要求排列出来1~n升序的状态,你的操作只能选择一个偶数长度的区间,交换前一半和后一半,求操作过程,只要答案不超过9的6次方即是正确答案!思路:方法肯定有很多了,开放性的题目:简单记录下自己比赛想到的吧:一个数一个数的归位,那么就枚举1~n,先预处理出来每一个数的位置id[i]。然后判断当前位置,和正确位置。先判断能否一步到达, 所谓一步原创 2016-09-23 23:42:34 · 523 阅读 · 0 评论 -
习题8-11 UVA - 1615 Highway 高速公路 (区间枚举)
大体题意:告诉你n 个点的坐标,求在x轴上至少找多少个点能够满足 至少存在一个点到那n 个点的距离小于等于D。思路:比较简单的题目,没想到1Y 了。n 个点的坐标相当于告诉你了圆心,D就是半径,构造一个圆,在x轴的两个交点分别作为区间的左端点和右端点。然后把n 个区间按照右端点排序,当下一个区间的左端点l 大于 这个区间的r 时,就改ans++ 新加一个点。否则不加,继续枚举!原创 2016-07-04 22:05:15 · 469 阅读 · 0 评论 -
习题8-12 UVA - 1153 Keep the Customer Satisfied 顾客是上帝(优先队列贪心)
大体题意:给你n (n 思路:其实思路,在PDF中已经很明显了,先按照终止日期排序,因为要想完成更多的任务,你就必须先完成终止日期小的任务。其次就是选任务了,在PDF文章中,他选择了2,3,5,6任务,1没有选择,但1一开始肯定是符合要求的,所以思路肯定是排完序后,先选择,当选择不了(时间不允许时),看看当前选择不了的任务是否比已选择的任务中最差的更加优,所以就把更优的选入,最差的原创 2016-07-04 17:42:05 · 454 阅读 · 0 评论 -
习题8-10 UVA - 1614 Hell on the Markets 奇怪的股市(贪心)
大体题意:给你n 个数,让你变换n 个数的符号,添加正号或者负号,使得最终所有的数字和为0,如果可以达到目标输出所有数字的符号,否则 输出NO思路:贪心做。把n 个数存到结构体中,结构体包含数值大小v 和id 。按v排序,然后从后往前扫,因为结果是0嘛,当前和大于0 的话减去当前的数,否则加上当前的数,然后判断最后sum 是否为0 即可!#include#incl原创 2016-06-13 23:45:49 · 469 阅读 · 0 评论 -
习题8-4 UVA - 11491 Erasing and Winning 奖品的价值(滑动窗口)
大体题意:给你一个n 位的整数,让你删除其中d个数字,使得剩下的n-d个数字组成的数尽量大!问最大是多少?思路:因为n最大是100000,所以存数字要用char 数组来存,然后遍历每一位数字s[i];在建立一个char ans[maxn] 来存取答案!int cnt表示ans数组第几个数值,那么n - i 为剩下的还没遍历的数的个数,cnt 表示已经加入的数的个数,n-原创 2016-05-22 22:14:43 · 365 阅读 · 0 评论 -
习题8-3 UVA - 12545 Bits Equalizer(贪心)
题意:输入两个字符串,第一个字符串包括0,1,?, 第二个字符串只包括0和1,问由第一个字符串转换到第二个字符串最少多少个操作?其中操作有3个,1.可以把问号变成1或者0。2.可以交换任意两个数字。3.可以把0变成1.思路:仔细想想,可以得出,如果第一个字符串1的个数大于第二行的话,你怎样变都无法变过去。所以这种情况直接输出-1.如果不是的话,那么你就统计0-1,原创 2016-06-24 18:19:14 · 515 阅读 · 0 评论 -
习题 8-18 UVA - 1619 Feel Good 感觉不错 (容斥定理)
大体题意:给你一个长度为n (n 思路:思路是比较清晰的,就是有坑:用sum[i]表示 1 ...i 的和,l[i],r[i],分别表示以第 i 个数字为最小值所能扩展的最左端和最右端!最后遍历i 更新ansll ans = a[i] * (sum[r[i]] - sum[l[i]-1]);取个最大值即可!求l 和r 数组还不能暴力求,这样会超时。原创 2016-05-20 21:46:07 · 412 阅读 · 0 评论 -
习题8-7 UVA - 11925 Generating Permutations 生成排列(构造)
大体题意:给你n 个元素的数组,让你由1,2,3,4...n 变成所给序列,步骤都有哪些,其中步骤操作有两种:操作1:交换前两个元素。操作2:把第一个元素放到最后。思路:可以逆向考虑:由所给序列变成1,2,3,4...n这样操作1不变,操作2变为把最后一个元素放到第一个,然后逆向输出答案即可!先有一个判断是否合法的函数,循环条件是 不合法,就一直循环下去。看样例原创 2016-05-20 16:24:48 · 671 阅读 · 0 评论 -
习题8-2 UVA - 1610 Party Games 聚会游戏 (构造字符串)
大体题意:给你n 个字符串(n 是偶数),让你构造一个字符串ans,使得n个字符串中有一半字典序小于等于ans 另一半大于ans。思路:稍微借鉴了学长的博客 = = !感觉写的确实很巧妙!整体思路就是建立一个空的string 然后暴力一位一位的加字母判断就可以了!首先:先给string 数组s进行排序,在取出两个字符串u = s[n/2-1] v = s[n/2]原创 2016-05-19 00:12:57 · 438 阅读 · 0 评论 -
习题8-1 UVA - 1149 Bin Packing 装箱 (滑动窗口)
大体题意:给你n个物品,每个物品会告诉你重量,再告诉你背包的最大容量m,并且每个背包最多装两个物品(即使重量有剩余),问装完n个物品至少需要多少个箱子 思路:先给n个重量拍个序,然后变量l 枚举左边,变量r 枚举右边。当a[l] + a[r] 当不符合时肯定把大的重量装进去了,这时只需要r--, ++ ans 即可!最后输出ans循环条件是l 感觉有滑动窗口的味原创 2016-05-18 22:04:11 · 510 阅读 · 0 评论 -
UVA 1616 Caravan Robbers(二分 + 小数变分数)
大体题意:给你n 个线段,要求重新规划每个线段,使得每个线段的长度都一样,并且线段之间没有交点,问线段的最大长度是多少?思路:很容易想到二分线段的最大长度,然后看这个长度是否合适,合适就往右划分,不合适就往左划分。我直接说正解了:因为是输出分数,我们应该二分的时候用小数,然后小数变分数,找一个最接近的分数即可,枚举分母计算分子就可以。吐槽:一开始用的分数类二分,这样肯定原创 2017-03-11 00:02:11 · 718 阅读 · 0 评论