紫书第八章
accosmos
这个作者很懒,什么都没留下…
展开
-
分治法
最大连续和,给出一个长度为n的序列,求一段子序列,要求和最大。 分析:分治法,分为三段,左,中,右, int maxs = max(maxsum(A, x, m), maxsum(A, m, y));//左和右分别求最大值 v = 0; L = A[m - 1]; for (int i = m - 1; i >= x; i--) L = max(L, v +=...原创 2019-01-25 19:09:00 · 155 阅读 · 0 评论 -
uva1618
题意:对于一个长度为n的序列,找到四个数,np,nq,ns,nr使得nq>nr>np>ns或nq<nr<np<ns。 分析:枚举p,和q,剩下的就是找p和q区间的最值问题。 RMP问题,有一个高效的算法是ST算法 ST算法实际上就是动态规划,mp[i,j]表示从i开始长度为为2^j的区间(包含i)内的最值,那么将mp的区间分成mp[i,j-1],mp[i+...原创 2019-02-23 09:13:29 · 264 阅读 · 0 评论 -
uva11536
题意:给定一个序列,找出包含1到k的元素的最短序列,序列定义是X0=1,X1=2,X2=3,Xk=(Xk-1+Xk-2+Xk-3)%m+1。 分析:滑动窗口,先找出包含这k个值的最大序列,然后将序列缩小,找到之后就取出一个先前加入的元素,寻找下一个。 #include <stdio.h> #include <string.h> #include <algo...原创 2019-02-24 09:17:26 · 245 阅读 · 0 评论 -
uva1619
题意:给定一个序列,求一串连续子序列,使得连续子序列的和*连续子序列最小值最大。 分析:这题只能用前缀和和区间最小值来解决了,就要看以什么为搜索对象。 以最小值为搜索对象,搜索一个最大区间,使得区间里的数都大于这个最小值。 for (int i = 1; i <= n; i++) { while (A[i] <= A[L[i] - 1])L[i] =L[L[i] - ...原创 2019-02-24 10:18:31 · 432 阅读 · 1 评论 -
uva11925
题意:输入一个1~n的序列,【1,300】,用不超过2*n^2次操作把它升序排列成输入的,操作有两种:交换前两个元素;把第一个元素是移动到最后。 分析:因为要把升序序列排列成给定的,所以可以先将给定的序列排列成升序序列,操作再逆序输出,操作1不变,操作2原来是从头部移动到尾部,现在从尾部移动到头部。 #include<iostream> #include<string>...原创 2019-02-19 06:41:29 · 116 阅读 · 0 评论 -
uva11175
题意:D图是一个有向图,E图是D图的边作为点连接起来的有向图。给定一个E图判断是否可以变成D图。 分析:又是找特殊方法。网上给的方法是对于E图来说,有两个点都指向k点,那么这两个点只有一个指向下一个点,那么这个E图就不能转换。这个是可以证明的。 #include<iostream> #include<string.h> #include<sstream> ...原创 2019-02-28 20:19:02 · 281 阅读 · 0 评论 -
uva12559
题意:给出n行m列的01字符,找出圆,其中圆的边是1表示。 分析:拿到题一脸懵逼,作者说方法很多,但我就是想不到,看了一下大佬的解法,只能卧槽,幸好题目的数据比较小,这题也是一道关于误差处理的。 #include<iostream> #include<string.h> #include<sstream> #include<set> #incl...原创 2019-02-28 21:45:02 · 323 阅读 · 0 评论 -
uva1580
题意:给定一个水池,水池每个格子都有深度,给出a,b使得放入水池的矩形长,宽不超过a,b。找出一个矩形,使得体积最大 分析:暴力可以过,但是有很多其他解法,比如二分体积,枚举位置;或者是以深度为搜索对象,相同的深度格子连接起来,这种方法要要考虑一些细节。 #include<bits/stdc++.h> using namespace std; #define rep(...原创 2019-02-28 23:23:44 · 316 阅读 · 0 评论 -
uva1612
题意: 有 n 位选手参加编程比赛。比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交的越早,预得分越大)。 接下来 是系统评测。如果某道题未通过测试,则改题的实际得分为0分,否则得分等于预得分。得分相同的选手,ID小的排在前面。 问是否能给出所有3n个得分以及最后的实际名次。如果可能,输出最后一名的最高可能得分。每个预得分均为小于1000的非...原创 2019-02-19 23:34:43 · 219 阅读 · 0 评论 -
uva1312
题意:给定一个n*m的网格,给出网格上的k个点,找出不包含点在内的最大正方形(边界不算)。 分析:枚举y和y的间距,搜索在间距内的点的x的间距。 #include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorithm> #inc...原创 2019-02-25 21:37:21 · 256 阅读 · 0 评论 -
uva1620
题意:给定一个圆盘,里面放入1~n个数,每次可以翻转4个数(前后顺序调换),使得最后的排列为1~n。 分析:这题是有规律的,先看一下逆序数 1 2 3 4 5 6 8 7 逆序数为0+0+0+0+0+0+1+0=1 1 3 2 4 6 5 逆序数为0+1+0+0+1+0=2 7 1 2 3 4 5 6 逆序数为6+0+0+0+0+0+0=6 在一个排列中,如果一对数的前后位置与大...原创 2019-02-25 23:38:58 · 292 阅读 · 0 评论 -
uva1613
题意:输入一个n(3=<n<=9999)个点m条边(2=<m<=100000)的连通图,n保证为奇数,设k为最小的奇数。使得每个点 的度数不超过k,你的任务是给每个点涂色,使得相邻两点颜色不同。 分析:贪心,将涂色的点周围点都列出来,找没被涂色最小的点。 #include<iostream> #include<string.h> #includ...原创 2019-02-20 15:42:47 · 225 阅读 · 0 评论 -
uva1614
题意:输入一个长度为n的序列a,满足1<=ai<=i,要求确定每个数的正负号,使得所有数的总和为0。 分析:和为奇数肯定是不能,一开始想法是找序列中最大和第2大的数,然后相减,再加入队列,重复此过程,就是Huffman编码。但是其实并不需要这样,求出能加到序列和的一半的序列就好了。 #include<iostream> #include<cstring>...原创 2019-02-21 06:37:11 · 288 阅读 · 0 评论 -
uva1615
题意:给定平面上n个点,和一个值,要求在x轴上找到最少的点,使得对于给定的每个点,都能选出和它欧几里得距离不超过d的点 分析:贪心,从左向右,每次都找欧几里得最大的。 #include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorit...原创 2019-02-21 07:26:59 · 168 阅读 · 0 评论 -
uva1153
题意:已知有n个工作,已知每个工作需要的工作时间qi和截至时间di,工作只能串行完成,问最多能完成多少个工作 分析:贪心,先按截止时间排序,建优先级队列,主要是要取出截止时间大,需要时间大的工作,每次加入队列时要进行比较,比队列中截止时间最长的队列的需要时间少,并且能在规定时间做完,则加入队列,因为刚加入的截止时间又大,需要时间又小,比起队列中最大的,肯定是刚加入的更好了。 #include...原创 2019-02-21 08:35:11 · 213 阅读 · 0 评论 -
uva1621
题意:数轴上有n个点,给定3种票,分别能走1 2 3,数量分别为a b c,a+b+c=n,每次只能依靠票来移动,找到一种移动序列 分析:这题又很玄乎了,总感觉在做奥数题,需要找到特定的规律,看大佬的代码,才知道怎么写,先将3这个票数移动完,然后使得移动完之后3的左边是没有空位置的,一开始拿到题目,我也想到了这一点,但是没往下再想。。因为每种票数量都大于3,所以总能找到一种方法使得3移动完,移动...原创 2019-02-26 22:31:05 · 439 阅读 · 0 评论 -
uva1617
题意:有n条长度为1的线段,现给出它们的区间,找出它们的位置,使得它们间的空隙数目最小 分析:贪心,按r,l进行排序,从左向右找,每次都取最右端,若r大于当前最后一个就可以放在r+1,r等于当前,那么当前的可以放在r-1的位置,r就放在r的位置,l大于当前最后一个,那么表示不相交,肯定有一个空隙 #include<iostream> #include<string.h>...原创 2019-02-23 06:56:54 · 203 阅读 · 0 评论 -
uva10366
题意:给出l和r,然后从l坐标到r坐标每隔两个位置有一个档板,给出挡板的高度,然后想(-1, 1)中间加水,问什么时候会溢出。 分析:只看一段区间的最大板块 for (int i = q; y[i] <= L; i++) { k += tmp; tmp = max(tmp, y[i+1]); } 这种方法很精妙,我想复杂了。 #include...原创 2019-02-27 22:29:26 · 197 阅读 · 0 评论 -
排序方法
归并排序: 原理是分治法,分成两份。 void merge_sort(int *A, int x, int y, int *T) { if (y - x > 1) { int m = x + (y - x) / 2; int p = x, q = m, i = x; merge_sort(A, x, m, T); merge_sort(A, m, y, T); ...原创 2019-01-25 21:27:17 · 125 阅读 · 0 评论 -
uva-11134
题意:指定n个矩形,并在每个矩形里面放一个战车,要求战车不能相互攻击。 分析:贪心算法,将二维坐标分解成两个一维x,y。分别找出x,y不会重合的部分。 #include<iostream> #include<string.h> #include<sstream> #include<algorithm> #include<vector>...原创 2019-02-15 15:17:10 · 299 阅读 · 0 评论 -
UVA - 1606 Amphiphilic Carbon Molecules
题意:平面上有n个点n<=1000,分为黑白两个点,用一条线分开,使得两边两个点(只能单独取黑或白)最大。 分析:这题首先肯定是用枚举,涉及到角度精确的问题,和巨人与鬼很相似。参考了作者的方法,还是orz。 int L = 0, R = 0, cnt = 2; while(L < k) { if(R == L) { R = (R+1)%k; cnt++; }...原创 2019-02-15 17:12:25 · 128 阅读 · 0 评论 -
UVA - 11572
题意:输入一个长度为n(n)的序列A,找到一个尽量长的连续子序列,使得序列中没有相同元素。 分析:两种方法,一是以序列为对象搜索,每次向前增加一个,有重复就减少。 二是,找到相同的元素位置,找出相同元素之间距离最大的。 #include<iostream> #include<string> #include<sstream> #include<se...原创 2019-02-15 17:55:54 · 302 阅读 · 0 评论 -
uva120
题意:翻煎饼,翻成从小到大排序。 分析:每次都找最大的移动,最大的前面煎饼就不用考虑了。 #include<iostream> #include<string> #include<sstream> #include<algorithm> #include<vector> using namespace std; int a[100 ...原创 2019-02-08 11:15:08 · 368 阅读 · 0 评论 -
uva1605
题意:设计一栋有n层的楼,每层都有m行k列的格子,将这些格子分给不同的国家,使得每个国家都有相邻的格子。 分析:方法很多,因为限制很少,刚开始想复杂了,其实只需要考虑以最简单的方法将它们两两相邻就好了。 #include<iostream> #include<string> #include<sstream> #include<algorithm&g...原创 2019-02-08 13:20:18 · 135 阅读 · 0 评论 -
uva-1471
题意:给一个长度为n(n<=200000)的序列,删除一个连续的子序列,使得剩下的序列中有一个长度最大的连续递增子序列。 分析:从前往后记录每个位置的最长连续递增序列,从后往前记录每个位置的最长连续递增序列。 作者代码 #include<cstdio> #include<set> #include<cassert> using namespa...原创 2019-02-15 20:46:04 · 295 阅读 · 0 评论 -
uva1451
题意:给定一个长度为n的01串,选一个长度至少为L的连续子串,使得子串平均值最大,如果多解,子串长度应尽量小,如果仍多解,起点编号尽量小。 分析:用了数形结合的思想,将平均值的变化用斜率表示出来,找到斜率最大的点。 作者代码: #include<cstdio> using namespace std; const int maxn = 100000 + 5; in...原创 2019-02-15 23:33:15 · 253 阅读 · 0 评论 -
uva714二分法
题意:把一个m个数的正整数序列划分成指定的若干序列,使得各个子序列和的最大值最小。 分析:二分法,将最大值逐渐缩小,直到可以划分。 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> #define ...原创 2019-02-16 06:45:53 · 136 阅读 · 0 评论 -
uva12627
题意:k时间里,计算在规定行里的红气球数量 分析:递归,例题解析的很明确,两行总数相减。 #include<iostream> #include<string> #include<sstream> #include<set> #include<algorithm> #include<vector> #include<...原创 2019-02-16 07:48:11 · 146 阅读 · 0 评论 -
uva11093
题意:有n个加油站,每个加油站可加油pi,从一个加油站到另一个加油站需要qi油,问是否可以跑完所有加油站。 分析:枚举加油站起点。 #include<iostream> #include<string> #include<sstream> #include<set> #include<algorithm> #include<v...原创 2019-02-16 08:17:25 · 138 阅读 · 0 评论 -
uva1608
题意:一个序列任意连续子序列中至少有一个只出现一次的元素,则称这个序列是non-boring的。 分析:任意连续子序列至少有一个只出现一次的元素。order序列中找到出现一次的元素,然后从这个元素前半部分和后半部分找non-boring序列。依次递归。 还有一种不知道可不可行,就是找重复在一起的相同元素。比如 1 2 3 3 4只需要找到3这个连续重复的元素就可以认为是boring的。 #...原创 2019-02-16 14:24:04 · 272 阅读 · 1 评论 -
uva1442
题意:向一个洞穴里面灌水,使得水不会触碰到顶(可以无限接近),最多可以灌多少。 分析:从左往右搜索,寻找最合适水位,从右往左搜索,寻找最合适水位。 1.如果顶点小于水位,说明要降水位水位=顶点。 2.如果底端大于水位,说明水被隔断,要升水位,水位=底端。 #include<cstdio> #include<algorithm> using namespace...原创 2019-02-16 15:14:34 · 157 阅读 · 0 评论 -
uva10570
题意:输入一个序列,每次可以交换两个整数,用最少的交换次数,使得序列变成一个环状序列 分析:看了网上大多数都是暴力,列举1到n分别作为开头,分别正序和逆序。 #include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorithm>...原创 2019-02-22 07:01:25 · 238 阅读 · 0 评论 -
uva11491
题意:给定n长度串,删除d个使得剩下的值最大 分析:一一比较,小于就删除。 #include<iostream> #include<string> #include<sstream> #include<set> #include<algorithm> #include<vector> #include<map>原创 2019-02-17 08:14:18 · 98 阅读 · 0 评论 -
uva1623
分析:找出当前下雨天之前的最后一个满湖的位置,从当前开始找不下雨天。 #include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorithm> #include<vector> #include<map>原创 2019-02-27 14:25:54 · 204 阅读 · 0 评论 -
UVA1622
题意:有一个n*m的网格,每个格子里有一个机器人,每次可以发出north,south,east,west,指令,使得所有机器人朝一个方向移动,走出网格就不能继续执行指令,求出机器人的最大指令执行数量。 分析:题目不难,但是要考虑的因素有很多,很可能考虑不周全。 想出来要先判断走东西还是南北,并且要模拟走东西和南北那个走的次数总和最大,这个模拟不能直接算出上下或左右最少的走完了的数量,因为它下面...原创 2019-02-27 10:23:56 · 333 阅读 · 0 评论