
第八章 高效算法设计(例题)
aozil_yang
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
例题8-5 UVA 11054 Gergovia的酒交易
题目描述的好少,好简单, 但基本想不到思路, 看了分析看了很长时间: 之所以是从头开始扫,是因为第一个村庄的酒一定是从2号位置或者更靠右的位置运来,可以把1号与2号合在一起,那么2号的值就变成了a1 + a2;依次类推,可以把所有的村庄压倒最后一个,那么也就意味着,扫描是从一头倒一头扫,而不是从中间! 题目要求的是最少劳动力,所以ans是从0加到最后一个,就是每一个村庄都需要扫到!原创 2015-12-23 14:18:41 · 683 阅读 · 0 评论 -
UVA 120 Stacks of Flapjacks 煎饼
转煎饼。 大体题意: 从上到下,给你n张饼的大小,你可以倒置某一张饼及其上面的全部的饼,问怎样做,可以使得饼从上到下,按从小到大顺序排序? 分析: 思路就是书中说的思路:从大到小依次遍历,先看是否在合适的位置,不再的话把他转到最上面,在转到合适位置! 注意: 1.数字不一定从1开始。 2.没有重复元素! 代码如下: #include #include #inclu原创 2016-02-07 16:08:07 · 537 阅读 · 0 评论 -
例题8-11 10954 - Add All全部相加
很简单一道题目。 大体思路就是建立一个优先队列,数值小的优先级大,每次取出后,sum += a + b,总共操作n-1次! #include #include using namespace std; typedef long long ll; int main() { ll k,n; while(scanf("%lld",&n) == 1 && n){ pri原创 2016-02-11 18:44:51 · 410 阅读 · 0 评论 -
例题8-13 UVA 11093 Just Finish it up 环形跑道
大体题意不说了,书上说的很清楚! 思路: 1.首先先从1开始模拟检测,当发现i = p时,sum 直到发现结束位置比开始位置小的时候,那就说明无解应该输出-1. 因为一旦出现结束位置比开始位置小,说明1到 开始位置都不可以,开始位置到结束位置都不可以,而这两个的并集就是全集,所以1到n没有合适的位置! 否则就输出那个开始位置! 代码如下: #include con原创 2016-02-13 16:56:56 · 473 阅读 · 0 评论 -
UVA - 1605 Building for UN (思路题)
大体题意: 给你n个国家,让你构造一个联合国大楼,满足不同的国家都有一对相邻的格子(要么是同层中有公共边的格子,要么是相邻层中的同一个格子。) 思路: 书上的思路: 一共只有两层,每层都是n*n,第一层中第i行全是i国家,第二层中第i列都是国家i 暴力输出即可! 这样做很巧妙! 举个例子: n = 4 情况: 按照这种方式是: ------------ 第一层: AA原创 2016-05-17 22:19:36 · 383 阅读 · 0 评论 -
例题 8-3 UVA - 1152 4 Values whose Sum is 0(和为0的4个值)(二分枚举)
题意: 给你4个n 元素的集合ABCD,要求分别从中选取一个元素abcd使得a + b + c + d = 0问有多少种选法! 思路: 先把A数组和B数组所有的组合情况都记录到tmp数组,排序,然后枚举C数组和D数组,取相反数,然后二分枚举tmp数组中值, 取上界upper_bound 和取下界 lower_bound 做差即可! #include #include #include u原创 2016-05-19 14:58:14 · 496 阅读 · 0 评论 -
例题8-12 UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (递归)
大体题意不说了 书上画的很清楚= = ! 思路: 令f(k,i)表示第k 小时后,从上面数i 行 红气球的个数,那么答案就是 f(k,b) - f (k,a-1); 通过看图不难发现: 如果i >= pow2(k-1) 那么 f (k,i) = 2 * C(k-1) + f (k-1, i - pow2( k-1 ) ); 否则 f(k,i) = 2 * f (k-1,i); 其中C原创 2016-07-05 11:22:57 · 422 阅读 · 0 评论 -
UVA 1471 Defense Lines (STL + 二分)
大体题意: 给你一个长度为n(n 思路: 因为要删除一个连续的子序列,所以会分成左右两部分之和的形式,我们枚举右边一部分的起点位置i,快速的找到左边一个合适的位置j,使得a[j] (注: g[i]表示以i 位置结束的最长上升连续子序列的长度,f[i]表示以i位置开始的最长上升连续子序列的长度) 这样我们可以利用set 来维护当前合法的左边位置的值。 什么是合法的? 必须是a[i]原创 2017-03-01 22:21:22 · 372 阅读 · 0 评论 -
UVA 714 Copying Books(二分+贪心)
大体题意: 给你n 个数,要求分成m份,使得m份中的最大值最小,要求打印解,如果多解,要求第一份最小,其次第二份最小,,依次类推。 思路: 最大值最小,肯定是二分了。 我们直接二分最大值,找一个最小的答案x。 然后我们划分n 个数,因为越往前越小,所以肯定从后向前枚举。 然后第i 个数要不要划分的话,有两个依据,当前和超过了x 或者 剩下的可以切的刀数不足 要求的刀数,那么就必须划分原创 2017-02-26 00:24:34 · 417 阅读 · 0 评论