
训练之南第一章
flowser
you are what you want to be
展开
-
uva11292 - The Dragon of Loowater (贪心)
题目:有n头恶龙,diameter存其直径,有m个骑士,height存其身高,国王雇佣骑士杀恶龙,佣金为所雇佣骑士身高之和,每个骑士只能杀一条龙且只能被雇一次,求国王需付最少佣金。思路:排序 + 贪心原创 2016-01-24 12:24:53 · 415 阅读 · 0 评论 -
uva1398 - Meteor
题意:n个流星,二维,给定初始坐标和速度,及一个坐标(0,0)到(w,h)的矩形。有个望远镜要拍摄,问能够同时在望远镜中拍摄到的最大的流星数目为多少?思路:要想所有流星在矩形里同时出现的数目最多,那么确定流星在矩形里出现的时段最重要,如果求得每科流星在矩形里出现的时间区间,那么让其时间区间排序后扫描一下,保留最大流星个数即可。求时间区间时可将速度分为x,y方向的两个量分量分开求,进原创 2016-02-02 15:40:19 · 452 阅读 · 0 评论 -
uva11549 - Calculator Conundrum
题意:一个数k,让它一直平方一直平方,它只能显示n位数,求这个n为数最大为多少。思路:我们可以得到,这个数将出现循环,所以可用set容器中的count函数检测某元素在此前是否出现过,一直获得下一个数,保留最大值即可。代码:#include #include #include #include #include #includ原创 2016-02-02 15:28:02 · 314 阅读 · 0 评论 -
uva11078- Open Credit System
题意:给定一个长度为n的整数序列,找出两个整数使得其差最大。思路:不断更新最大值和最大差即可。代码:#include #include #include #include using namespace std;int arr[100005];int main() { int cas; scanf("%d", &cas); while (c原创 2016-02-02 15:15:27 · 394 阅读 · 0 评论 -
uva11464 - Age Sort
题意:n个居民,给定他们的年龄(1-100),将他们从大到小排序。思路:把年龄存进cnt[年龄]数组里,再输出即可。代码:#include #include #include #include int cnt[101];int main() { int n; while (~scanf("%d", &n)&& n) { int i,t;原创 2016-02-02 15:11:05 · 344 阅读 · 0 评论 -
uva1335 - Beijing Guards
题意:n个人,每个人都想要礼物,相邻两个人会聊天炫耀礼物,不能让他们礼物相同,问至少要多少个礼物才能满足条件。思路:首先,偶数个人的话,礼物个数即为最大的两个邻居想要礼物数之和。 奇数个人的话比较复杂,二分搜索最小礼物个数p,将礼物分为左右两堆,左堆放x,右堆y(x+y=p),left[i],right[i]分别表示第i个人拿走了左,右两堆多少个礼物,让奇数号的人尽量原创 2016-02-02 14:38:27 · 361 阅读 · 0 评论 -
uva11520 - Fill the Square
题意:给一个n*n的矩阵,含小数点及A-Z的字母,让你使用A-Z的字母填充小数点使得矩阵每个位置的字母与它的上下左右的字母都不相等,且字典序最小,输出填充后的矩阵。思路:枚举26个字母A-Z,依次判断是否可以填入矩阵的位置,保证了字典序的最小代码:#include #include #include using namespace std;int n原创 2016-02-02 13:55:40 · 463 阅读 · 0 评论 -
LA3635 - Pie
题意:F+1个人,分N个圆形派(给出其半径),每个人必须得到的是整块派(不能由几块拼在一起),求每个人能分到的最大面积的派。思路:二分搜索最大面积的派,判断是否可行。代码:#include #include #include #include #include using namespace std;const int maxn = 10005原创 2016-02-02 13:00:22 · 346 阅读 · 0 评论 -
uva12124-Assemble
题意:有b块钱,n个配件及其种类,质量,价格,让你每种类型的配件各买一个,总价不超过b元,让品质最差的配件质量最好,求最小品质的质量最大值思路:二分最小质量的最大值,再用贪心的思想判断该质量是否可行,即排序每种配件的价格,判断时按价格从低到高扫描,选择到符合该质量的即可。代码:#include #include #include using names原创 2016-02-02 12:45:55 · 340 阅读 · 0 评论 -
uva1382- Distant Galaxy (枚举)
题意:一个平面,n个点,找一个矩形(和x,y坐标平行),使矩形边界上的点更多。思路:枚举矩形的上下边界,再由其它条件求得左右边。left【i】表示竖线i左边的上下边界有多少点,on【i】表示竖线i不包括上下边界含有多少个点,on2【i】则表示竖线i包括上下边界含有多少点。若i表示左边界竖线,j表示右边界竖线,总数则为:left【j】+on2【j】+on【i】-left【i】.原创 2016-02-02 16:10:57 · 327 阅读 · 0 评论 -
uva10905 - Children's Game
题意: n个正整数,把他们拼成一个最大的整数 思路: 刚开始忽略了一个细节,对长度不同的各个整数的处理。 后来看到经典处理方法:123和56的比较可转为12356和56123的比较! 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;c原创 2016-02-13 14:06:01 · 266 阅读 · 0 评论 -
uva11100 - The Trip, 2007
题意: n个整数,要把不相同的放在一堆,求至少几堆,并把它们逐堆从小到大输出。 思路: 相同数字的不能放在一起,所以最大相同数个数就是所求,然后分包时要把它们隔开,如113455556667789,就有至少要4堆,要把5555给隔开装,这样的话就每个数字加4一包这样。代码如下:#include <iostream>#include <cstdio>#include <cstring>#i原创 2016-02-14 20:14:41 · 937 阅读 · 0 评论 -
uva10382 -Watering Grass
题意: 一长l宽w的草坪,水平中心线上有n个位置pi可安装喷水装置,其覆盖范围为以半径ri为圆。求最少需要多少个喷水装置。 思路: 首先,每个装置在长方形草坪上的有效覆盖面积为 左边界pos - sqrt((r*r - w*w / 4.0 ))到右边界 pos + sqrt((r*r - w*w / 4.0 ))宽l的长方形。这样记录下有效区间后此题就可转为经典区间覆盖问题。 代码如下:#i原创 2016-02-13 13:55:03 · 294 阅读 · 0 评论 -
uva10891 - Game of Sum
题意: 给一个序列,AB两人比赛,每人每次只能从左或从右取任意连续数,都足够聪明,极力想让自己赢,A先开始取,让你求A和B都取最优策略时,A-B的得分结果。 思路: 初写dp没多久,式子怎么也推不出来,看了题解,原来是这样的: 让sum[i]表示前i个数总和,要求A-B即求 A - (sum[n]- A),即求2*A-sum[n]。 求A的话,让dp[i][j]表示A在第i~j个数中取到的值,则dp[1][原创 2016-02-13 11:39:21 · 302 阅读 · 0 评论 -
uva10859 - Placing Lampposts
题意: 有n个点m条边的无向无环图,在尽量少的点放灯,让所有边都能被照,且尽量多的边同时被找到。 思路: 题目有两个地方要控制,a:一个是放灯的点——要尽量少,b:第二个是被两盏灯照到的边—-尽量多。 学到一个小技巧,就是将第二问题转为b:被一盏灯照到的边 — 尽量少,所求即x=Ma+b最小,M为一个比a,b大得多的数。 然后就是控制x使其最小了。 代码如下:#include <iost原创 2016-02-13 12:15:22 · 476 阅读 · 0 评论 -
uva11825 - Hackers' Crackdown
题意: 有n台计算机,每台计算机都运行n个服务器,让你去破坏,每台计算机你能破坏一种服务,它和它的邻居们的该台服务都会被破坏,所有计算机的这种服务都被破坏才算这项服务成功破坏,让你求最大能成功破坏多少种服务。 思路: 该问题可转为:把n个集合goup1,2,…n分成尽量多组,使每组中所有集合的并集等于全集。 代码如下:#include <iostream>#include <cstdio>原创 2016-02-13 11:54:16 · 611 阅读 · 0 评论 -
uva10635 - Prince and Princess
题意: 给你两个序列,求最长公共子序列。思路: 直接LCS会超时,所以将其转为LIS,即将其中一个序列转为单调递增的序列,再遍历,不断更新直至最长。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;con原创 2016-02-13 11:21:43 · 325 阅读 · 0 评论 -
uva1450 - Airport
题意: 一飞机场,东西方向(W、E)有两个待飞通道,共用一个起飞车道, 每一时刻有w[i]和e[i]架飞机进入W和E跑道,且当前只能起飞一架飞机。飞机编号从0开始,求最大飞机编号的最小值 思路: 一开始没认真推敲题目意思,一位最大飞机编号只要看最终状态, 然后草写几行过样例就交了,WA后才注意要求最大飞机编号的最小值,每个时刻都要考虑。用二分搜索该最小值。 判断条件的话,需要每个时刻的最大原创 2016-02-14 20:29:09 · 322 阅读 · 0 评论 -
uva11134 -Fabled Rooks
题意: 一个n*n的矩阵上放n个车,第i辆车在第i个区间上,每个区间给出左上角和右下角的坐标。任意两个车之间同行同列不能互相攻击,求这些车放置 的坐标。 思路: 第一眼看以为是N皇后的变形,后来发现车子斜上角不会相互攻击。则行列不会相互影响,即该问题可分别分解求行,求列的位置的问题,和上一题uva1422的做法一样,按左区间排序后通过优先级队列按右区间的优先级来做。 代码如下:#inclu原创 2016-02-13 20:53:30 · 254 阅读 · 0 评论 -
uva1267 - Network
题意:r一个编号1~n的n个结点的树状网络,其中间结点称服务器,叶子节点称客户端,从编号s的终端服务器开始可以将网络扩散k条边给客户端,除终端服务器外的服务器可任意设置,使其也可扩散k条边至客户端,问至少要设置多少个这样的服务器才能让所有客户端都可以接收到网络。思路:这题是从叶节点倒着遍历整棵树的,f[i]存i的父节点,g[i][j]则存第k层后的第i层的叶子,用两个dfs和s原创 2016-02-02 14:24:13 · 332 阅读 · 0 评论 -
LA3708 - Graveyard (等比缩放)
题意: 周长为10000的圆,等距分布n个点,加入m个点后,求要使n+m等分布,所要移动的最小距离。思路: 等比缩放,将圆缩小为周长为n+m的圆代码:#include #include #include #include #include #include using namespace std;int main(){ int n,原创 2016-01-24 15:08:16 · 336 阅读 · 0 评论 -
uva10795 - 新汉诺塔问题 (递归)
题意:汉诺塔问题,给n个大小不同的碟子及它们的初始位置和目标位置,求出最少的步数,使得每个碟子从初始位置移动到目的位置。思路:找出需要移动的最大碟子k, 将1~k 移动到 pos位置(6- start[k] - finish[k] --- ( 三个柱子位置1+2+3 - 初始位置 - 目的位置 )---- 即转移需要借用的柱子的位置),同时要让k-1移动到6-start[原创 2016-01-24 15:42:20 · 1048 阅读 · 0 评论 -
uva11384 - Help is needed for Dexter (递归)
题意:给定n,1~n序列,求把序列1~n变成0的最少操作次数,每次操作可任选其中1或几个数减去任意一个相同正整数。思路:递归,如 :1 2 3 4 5 6 7 8 一次操作以后变成 1 2 3 4 1 2 3 41 2 3 4 一次操作后变成 1 2 1 2 1 2 1 2 一次操作后变成 1 1 1 1最后变成 0 0 0 0 代码:原创 2016-01-24 15:27:04 · 278 阅读 · 0 评论 -
uva11464 - EVen Parity (枚举)
题意: 一个n*n矩阵(由0/1组成),将尽量少的0变成1,使得每个元素上下左右(有的画)的元素之和为偶数,求改变的元素的最小个数,无解则输出-1;思路: 枚举第一行(最多为15),一次由上一行计算出下一行,比较,求得最小个数代码:#include #include #include #include #include using namespace std原创 2016-01-24 15:18:38 · 407 阅读 · 0 评论 -
uva10881 - Piotr's Ants (等效变换)
题意: 一根长Lcm的木棍,n个蚂蚁在上面爬,1cm/s,给出它们的行走方向,蚂蚁相撞掉头继续走,问T秒后,各蚂蚁的状态。思路: 蚂蚁一开始从左到右的顺序,与T秒后停止时的顺序存在映射关系,以此思路解题。代码:#include #include #include #include #include #include using na原创 2016-01-24 14:38:46 · 295 阅读 · 0 评论 -
uva11300 - Spreading the Wealth (中位数)
题意:n个人(1,2,…n),围成圈站(即第一个人左边是最后一个人),每个人有一定金币数,可将金币转移左右相邻的人,合理分配使得每个人的金币数相同,求分配过程中需转移金币的最小值。思路:1 给 2 x2 个金币2 给 3 x3 个金币k 给 k+1 k+1个金币n 给 1 x1 个金币Aver = a1 - x2 + x1原创 2016-01-24 14:07:02 · 367 阅读 · 0 评论 -
UVA11729 - Commando War (贪心)
题意:n个任务,需要交代B分钟,执行J分钟,让你合理选择交代任务的次序,求得n个任务完成的最小总时长思路:为保证总时长最小,执行时长较大的应该先执行,所以每个按执行时长由大到小排序求得总时长。代码:#include #include #include #include using namespace std;struct solder{ int b, j原创 2016-01-24 12:34:46 · 932 阅读 · 0 评论 -
uva10755 - Garbage Heap
题意: 求最大子立方体和 思路: 这题是二维版的最大子矩阵和问题和一维版的最大子段和问题的三维版,预处理arr[k][i][j],表示该小块同层arr[k][1][1]~arr[k][i][j]之和,和该题二维版的解法类似,该问题即为按层求最大和。代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <al原创 2016-02-13 11:02:48 · 323 阅读 · 0 评论 -
uva1330 - City Game
题意: 一个m*n的矩阵,一些格子是空地(F),一些格子被租用了(R),求空地中的最大矩形的格子数*3 思路: 记录每个格子向上拥有的最大空地的个数,然后再扫描每个格子,记录每个格子向左和向右的最大空地数,再保留最大矩阵的格子数 代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>u原创 2016-02-13 11:59:08 · 313 阅读 · 0 评论 -
UVA1422 - Processor
题意: move onto: 将a,b上的积木清空,然后将a放在b上。 move over: 将a上的积木清空,然后将a放在b的最上方。 pile onto: 将b上的积木清空,然后将a和a上的积木放在b上。 pile over: 将a和上的积木放在b的随上方。 a和b同一个积木堆时,任何操做都时无效的。代码:#include <stdio.h>int place[25];原创 2016-02-13 20:37:42 · 349 阅读 · 0 评论 -
uva10970- Big Chocolate
题意: m*n格的巧克力,沿着线切,一刀只能切一块,问至少需要几刀才能切成m*n块 思路: 先按m切或先按n切都可。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;int main() { int n, m; while (~原创 2016-02-13 13:37:34 · 384 阅读 · 0 评论 -
uva1368 - DNA Consensus String
题意: m个长度为n的序列,求一个dna序列,让其他所有序列的总汉明距离最小。输出该序列即最小距离。 思路: 按列枚举,依次求出每列对应的dna序列即可。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 10原创 2016-02-13 13:28:41 · 271 阅读 · 0 评论 -
uva1339 - Ancient Cipher
题意: 两字符串,求它们之间的26字母能否一一对应。 思路: 题目即求是否会有一个映射关系,若A->C,则所有A->C,这样实际上只要两个串相同字符数目是否能够一一对应即可。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const原创 2016-02-13 13:20:17 · 367 阅读 · 0 评论 -
uva11636 - Hello World!
题意: 通过复制粘贴打印”helloWord“,问要打印n个”helloWord“,至少要粘贴几次。 思路: 想了下感觉跟求树的深度差不多,写了几行代码果然AC 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace原创 2016-02-13 13:02:18 · 369 阅读 · 0 评论 -
uva11039 -Building designing
题意: n个绝对值不同的非0整数,求正负交叉绝对值递增能排出的最长序列长度。思路: 将序列按绝对值排序后再控制正负号即可 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int N = 500原创 2016-02-13 13:09:25 · 268 阅读 · 0 评论 -
uva1169 - Robotruck
题意: n个垃圾,有其坐标(x,y)即重量w,一机器人最多承受重量C,要按其编号依次去捡垃圾(它只能上下左右走)然后倒垃圾,垃圾桶在原点(0,0),求倒完所有垃圾需走的最小距离。 思路:直接dp的话复杂度O(100000*100)过大,因而用单调队列来优化。 dp[i]表示倒前i个垃圾的最小距离,sumd[i]表示前i个垃圾的曼哈顿距离,sumw[i]表示前i个垃圾的重量和,p[i].d表示i原创 2016-02-13 12:55:48 · 294 阅读 · 0 评论 -
uva1121 - Subsequence
题意:n个序列,求长度最小的连续序列使得其和》s思路:学会了一种新的方法—-尺取法 , 用到这里感觉恰到好处,很好用。控制好左右边界,一边扫描一边挪,保留最小值即可。代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>using namespace st原创 2016-02-13 12:01:23 · 301 阅读 · 0 评论 -
uva10340 -All in All
题意: 两个串s,t,判断s是否可由删除t中字符得到。 思路: 很简单,直接扫描+判断即可 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100005;char stra[N], strb[N];int原创 2016-02-13 13:41:17 · 445 阅读 · 0 评论