算法设计-高效算法
flowser
you are what you want to be
展开
-
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 · 310 阅读 · 0 评论 -
uva10827 - Maximum sum on a torus(最大子矩阵和变形)
题意: 是uva108求最大子矩阵和问题的变形,主要区别是该题为环形的思路: 参考了他人做法:将矩阵扩大4倍来解决了环的问题。其余和uva108相似:http://blog.csdn.net/conatic/article/details/50839179 代码:#include <iostream>#include <cstdio>#include <cstring>#include原创 2016-03-09 22:03:34 · 315 阅读 · 0 评论 -
uva108 - - Maximum Sum (最大连续子矩阵和)
题意: 求最大连续子矩阵和 思路: 最大连续子序列的变形。枚举第i行到第j行的和,再从i到j行的各列和依次累加,存入数组b,这样就转为一维的求数组b的最大连续子序列和的问题了。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;cons原创 2016-03-09 21:55:44 · 367 阅读 · 0 评论 -
uva757 - - Gone Fishing
一道很典型的贪心题,根据贪心决策,枚举会走到的湖泊(不走回头路),从最开始的湖泊依次到会走到的湖泊里钓鱼,扣除驾车时间后,将剩余时间划分为每次5分钟的时间段,在这些时间段里,贪心地找当前鱼最多的湖泊里钓鱼(因为扣除驾车时间,仅需考虑到哪钓鱼即可),若时间用不完,则剩余时间加到第一个钓鱼地点上。 代码如下: 代码:#include <iostream>#include <string.h>#i原创 2016-03-09 22:14:33 · 305 阅读 · 0 评论 -
uva10148 - Advertisement(区间选点)
题意: 贴广告牌,n个人,会分别在一个区间内跑步,区间点为整数,在这些整数里,你负责选点贴广告,让他们每个人都至少能看见K个广告,若区间范围小于k,则该区间都要贴广告 思路: 贪心题。参考了《算法经典入门》中做法,首先区间左小右大,然后按右边界排序,尽量多得在右边放广告牌,因为这样的话重叠部分小,所需放置的广告牌亦随之变小。代码如下:#include <iostream>#include <原创 2016-03-09 22:22:24 · 351 阅读 · 0 评论 -
uva10763 - Foreign Exchange
题意: 乙交换系统有n个人,每个人都有原地址和目标地址,仅当它们恰好相反可以交换。如甲:1和3,乙3和1,它们俩就可以成功交换。问该系统能不能让所有人都成功交换。 思路: 题目是让所有人都可以交换,那么所有人拥有的目标地址,与所有人想去的目标地址,一定是一一对应的。因此排序再一一对比即可。代码:#include <iostream>#include <cstdio>#include <cs原创 2016-02-26 22:08:26 · 490 阅读 · 1 评论 -
uva10132 - File Fragmentation
题意: 一个字符串,有一堆副本,碎成两段,要你找原字符串。 (副本最后是原字符串的一部分) 思路: 代码写得有点乱,首先字符串碎成两段,我们要找到这两段拼起来再验证副本们是否能全部成为它的子串,找这两段的话应该找最长+最短的那个串。把最长串们放在large数组,最短串们放在small数组,然后枚举,直到验证成功。 代码:#include <iostream>#include <cstdi原创 2016-02-26 22:23:30 · 269 阅读 · 0 评论 -
uva270 - Lining Up(几何 - 最大共线点)
题意: 给你一堆二维点,求最大共线点数 思路: 暴力,先枚举前两个点,第三个点则采用三点共线公式: (x2-x1)/(y2-y1)=(x3-x2)/(y3-y2) ->(x2-x1)(y3-y2) = (x3-x2)(y2-y1)代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>原创 2016-02-26 22:28:34 · 348 阅读 · 0 评论 -
uva10341 - Solve It
题意: 求满足方程 p ∗ e−x + q ∗ sin(x) + r ∗ cos(x) + s ∗ tan(x) + t ∗ x*x + u = 0 的解x 思路: 这题用数学中在某区间求根的步骤+二分判断来写,比如区间【0,1】中有根,0与1 带入方程后所得的乘积就会小于0点点点 代码如下:#include <iostream>#include <cstdio>#include <原创 2016-02-26 22:33:21 · 235 阅读 · 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 · 286 阅读 · 0 评论 -
uva311 - Packets
题意: 给你一个一组一定数目大小为1*1,2*2,3*3,4*4,5*5,6*6的小方块,让你装进一个6*6的方块里,求最少需要多少个6*6方块数 思路: 参考了别人的做法。 思路如下: 贪心 ,若有多余则先装2*2的,后装1*1的,因为装了2*2若有多余仍可拆分成1*1 6*6可装 -> 一个6*6 -> 一个5*5+11个1*1原创 2016-02-28 22:16:02 · 348 阅读 · 0 评论 -
uva10487 - Closest Sums
题意: 求一个序列中存在的两个数之和sum与给定数k的差距的最小值 思路: 做法很残暴,直接不抱希望地暴力了,居然过了。 看到大家几乎用的都是二分,+。+ 可自行百度。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const in原创 2016-02-28 22:27:48 · 212 阅读 · 0 评论 -
uva10700- Camel trading
Sample Input 3 1+2*3*4+5 4*18+14+7*10 3+11+4*1*13*12*8+3*3+8 Sample Output The maximum and minimum are 81 and 30. The maximum and minimum are 1560 and 156. The maximum and minimum are 339768 an原创 2016-02-28 22:34:30 · 333 阅读 · 0 评论 -
uva10026 - Shoemaker's Problem
题意: 鞋匠要完成一些任务,给你任务的完成时间t和惩罚s,让你求出怎样安排这些任务可以使惩罚更小。 思路: 贪心,感觉跟可拆背包的想法差不多,贪心决策是根据每个任务的s/t从大到小排序 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;c原创 2016-02-28 22:38:42 · 310 阅读 · 0 评论 -
uva11100 - The Trip, 2007
题意: n个整数,要把不相同的放在一堆,求至少几堆,并把它们逐堆从小到大输出。 思路: 相同数字的不能放在一起,所以最大相同数个数就是所求,然后分包时要把它们隔开,如113455556667789,就有至少要4堆,要把5555给隔开装,这样的话就每个数字加4一包这样。代码如下:#include <iostream>#include <cstdio>#include <cstring>#i原创 2016-02-14 20:14:41 · 929 阅读 · 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 · 248 阅读 · 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 · 441 阅读 · 0 评论 -
uva10020 - Minimal coverage(区间覆盖)
题意: 区间覆盖问题,给你一些区间,让你用最少的区间数覆盖【0,M】,并输出所用区间。 思路: 跟上次写的UVA 10382 Watering Grass一个套路,上次写的应该是该题的变形题。 代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace st原创 2016-02-28 22:47:02 · 211 阅读 · 0 评论 -
uva507 - Jill Rides Again(最大子序列和)
题意: 给你一段序列,求最大连续子序列和 思路: 这题有很多变形,还有很多方法可解(详见水果君的六种姿势拿下连续子序列最大和问题http://blog.csdn.net/hcbbt/article/details/10454947) 最大子矩阵和,最大子长方体等 代码:#include <iostream>#include <cstdio>#include <cstring>#inc原创 2016-03-09 21:51:08 · 420 阅读 · 0 评论 -
uva10041 - Vito's Family(求中位数)
题意: 给你一些房屋的坐标,让你求一个点使得到这些房屋距离最小 思路: 题目要求的其实就是中位数 代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 505;int s[N];int main() { i原创 2016-03-09 21:41:07 · 312 阅读 · 0 评论 -
uva1330 - City Game
题意: 一个m*n的矩阵,一些格子是空地(F),一些格子被租用了(R),求空地中的最大矩形的格子数*3 思路: 记录每个格子向上拥有的最大空地的个数,然后再扫描每个格子,记录每个格子向左和向右的最大空地数,再保留最大矩阵的格子数 代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>u原创 2016-02-13 11:59:08 · 297 阅读 · 0 评论 -
uva1121 - Subsequence
题意:n个序列,求长度最小的连续序列使得其和》s思路:学会了一种新的方法—-尺取法 , 用到这里感觉恰到好处,很好用。控制好左右边界,一边扫描一边挪,保留最小值即可。代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>using namespace st原创 2016-02-13 12:01:23 · 289 阅读 · 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 · 261 阅读 · 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 · 334 阅读 · 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 · 380 阅读 · 0 评论 -
uva11549 - Calculator Conundrum
题意:一个数k,让它一直平方一直平方,它只能显示n位数,求这个n为数最大为多少。思路:我们可以得到,这个数将出现循环,所以可用set容器中的count函数检测某元素在此前是否出现过,一直获得下一个数,保留最大值即可。代码:#include #include #include #include #include #includ原创 2016-02-02 15:28:02 · 304 阅读 · 0 评论 -
uva1398 - Meteor
题意:n个流星,二维,给定初始坐标和速度,及一个坐标(0,0)到(w,h)的矩形。有个望远镜要拍摄,问能够同时在望远镜中拍摄到的最大的流星数目为多少?思路:要想所有流星在矩形里同时出现的数目最多,那么确定流星在矩形里出现的时段最重要,如果求得每科流星在矩形里出现的时间区间,那么让其时间区间排序后扫描一下,保留最大流星个数即可。求时间区间时可将速度分为x,y方向的两个量分量分开求,进原创 2016-02-02 15:40:19 · 437 阅读 · 0 评论 -
uva714 - Copying Books
题意: 给你一组数据,如:100 200 300 400 500 600 700 800 900,让你按序分成m组,使得每组的最大总和最小。 即:100 200 300 400 500 / 600 700 / 800 900 (注意每组至少要有一个数据,即100 100 100 100 100,m=4 不能分成 : / 100 100 /100 100 / 100 )思路: 刚开始没原创 2016-03-05 12:17:23 · 235 阅读 · 0 评论 -
uva10602 - Editor Nottoobad
题意: 一台声控机子,有两条命令:— “repeat the last word”, “delete the last symbol”.给你一些单词,让你用合理运用这两条命令,最少的敲击键盘打出这些单词。 思路: 很简单的一道贪心,排序+比较即可。 代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <原创 2016-03-05 12:22:00 · 327 阅读 · 0 评论 -
uva10400 - Game Show Math(回溯+剪枝)
题意: 给你一组数据及数target,让你按序用这组数据及加减乘除使得结果为target,有则输出序列,无则输出“NO EXPRESSION” Sample Input 3 3 5 7 4 3 2 1 1 2000 5 12 2 5 1 2 4 Sample Output 5+7/4=3 NO EXPRESSION 12-2/5*1*2=4 思路: 直接回溯,TLE了,马上想原创 2016-03-05 12:31:49 · 221 阅读 · 0 评论 -
uva11054 - Wine trading in Gergovia
题意: 一个镇上有卖酒和买酒的商家,然后假定这些商家的位置直线排列,给你它们买酒和卖酒数,然后它们恰好相同,但运酒要费用=到其它商家的距离(邻居的话距离为1)* 交易的酒数,求最小总费用。 思路: 贪心法,题目的运酒费涉及距离和酒数,卖酒和买酒的酒数相同,那么一给一供不管怎样抵消都是那么多,其实看的就是距离,这样的话直接邻居交易即可,从头到尾依次让当前这的需求由后者满足,就能得到最小费用 代原创 2016-03-05 12:45:52 · 405 阅读 · 0 评论 -
uva10670 - Work Reduction
题意: 老板给你n个任务,你只能最多留m个,你干不了就辞了你,现在一个机构能帮你完成任务,有A,B两种方案,金额不同,A能帮你完成1个,B能帮你完成当前的一半。 思路: 贪心的思路,题目要求的其实就是关于A,B的选择,如过当前扣掉一半后所得>=m而且经费画得比A少就选B,否则就选择A 代码:#include <iostream>#include <cstdio>#include <cst原创 2016-03-05 13:16:12 · 257 阅读 · 0 评论 -
uva10720 - Graph Construction(简单图的判定)
题意: 给你所有点的度数,判断是否为简单图 思路: 百度了简单图的判定条件,是这样回答的: 首先要求所有数(度)之和是偶数,其次判断是否为简单图,方法:依次删去度最大的点,递归下去,最后可确定是否是简单图. 按照这个思路写了代码,WA了,原因是只进行了第一趟排序,正确做法应当是每次都排序,才能保证依次删去最大点。 代码如下:#include <iostream>#include <cs原创 2016-03-05 13:22:03 · 910 阅读 · 0 评论 -
uva10716 - - Evil Straw Warts Live
题意: 给你一个串,问你是否能改动它们的顺序使之成为回文,能改变的话,最小改动数呢 思路: 看到题目的第一思路是能不能通过记录相同字符的位置来做,想来想去还是枪毙了,参考了他人做法,思路清晰明了(T——T,感觉我老是把简单问题想得复杂化了,终究是没想到点上。) 贪心法,主要就是从两端开始确定,慢慢向中间缩进,若两端相同,则直接缩进,若不同,则双向搜索能替换左右使其相等的最近交换距离,直到成功原创 2016-03-05 13:32:41 · 250 阅读 · 0 评论 -
uva620 - Cellular Structure
题意: 两个人A.B,给你n个石子,m种取石子方式,每次可选其中一种方式(即取a[i]个石子,1《i《m),然后A先取,谁先取完谁先赢。问谁先赢 思路: 博弈题,T_T不会写,参考了大神做法。博弈的话一方要是赢了,另一方就输。那从A的角度,dp[i]表示,剩下i,A去取的话能赢吗,只要dp[i-a[j]]==0,则dp[1]=1,表示A能赢,如果m种方式尝试后他仍为0,则输,这样0101交替,原创 2016-03-19 16:54:02 · 341 阅读 · 0 评论 -
uva10245 - - The Closest Pair Problem(最近点问题)
题意: 一个二维坐标,给你一些点,求距离最近的两点 思路: 直接暴力的话会超时,要加上剪枝,剪枝方法:按横坐标排序后,枚举第一个点及第二个点,若其横坐标之差已经大于当前最大距离的话,直接换下一个第一点。(T_T 没想到,思路是参考他人的) 这题还可以用分治的方法,分成左右两边各求最近点距离得到d,处理中间部分的话则在在[x-d,x+d]的点中找对,不断更新,求得最小距离。 代码如下:#in原创 2016-03-09 21:27:51 · 371 阅读 · 0 评论 -
uva11129 - An antiarithmetic permutation(不等差序列,分治法)
题意: 给你一个数n,让你求使得0-n这些数成为不含等差数列的序列。 思路: 这题用分治方法来做,0-n-1依次排列后,不断划分左右两边,将其按位置不断分为奇偶序列,划分至不能再分,即可求得结果。 证明可参考:http://www.2cto.com/kf/201308/238466.html 一个序列的等差是k,首项为a1,序列为,a1, a1 +k, a1 + 2k, a1 + 3k …原创 2016-03-09 21:38:17 · 398 阅读 · 0 评论 -
uva10714 - Ants
题意: 在一条【0,right】线段上有n只蚂蚁(给坐标),蚂蚁在上面左右行走,与其它蚂蚁碰撞后就掉头走,问所有蚂蚁中到边界所需的最长路径的最小值,最段路径的最大值 思路: 蚂蚁碰撞题,跟之前的uva10881 :http://blog.csdn.net/conatic/article/details/50573660 相似,主要都是蚂蚁碰撞后会互相交换对方的路线走。 代码:#incl原创 2016-02-28 22:59:10 · 307 阅读 · 0 评论