算法设计
文章平均质量分 59
二分查找
这个作者很懒,什么都没留下…
展开
-
hdu5402(构造;)
题意:给出一张图,每个点上都有一个非负的数值;要求从左上角走到右下角,走过的点不能再走,得到的最大数值是多少,并输出路线;思路:首先,如果是奇数行,或者奇数列,就很简单,迂回着走就能全部走完;现在我们要判断偶数行偶数列的情况;经过找规律,我们发现,可以在不走某一个点的情况下,完成;也就是我们可以得到所有数值,减掉这个点的数值;而可以不走的点要满足(i + j)%原创 2015-08-20 09:02:48 · 404 阅读 · 0 评论 -
uva10881(蚂蚁模拟)
题意:有n只蚂蚁,在长为L的木棍上,每只蚂蚁有一个位置和朝向,每秒爬1;如果两只蚂蚁碰头,就回头;问T秒后,每只蚂蚁的位置,如果已经下去了,输出Fell off,如果一个位置有两只蚂蚁,则朝向输出Turning;思路:首先我们知道,如果两只蚂蚁碰到,转向.那么木棍上看起来其实和没有转向是一样的,例如如果在5的位置,一只蚂蚁向左,一只蚂蚁向右,碰到了,其实转向完还是在5的位置,一原创 2015-01-25 18:42:57 · 576 阅读 · 0 评论 -
uva1388(数学)
题意:题目的意思就是在周长为10000的圆上,有n个雕像,等距离摆放着,现在要在加入m个雕塑,为了让这n+m个雕塑还是等距离摆放,要移动之前的n个雕塑,问移动距离和最小多少;思路:首先我们可以知道,把某个雕塑作为原点不动,则每个雕像都有自己的坐标,在将m个雕塑放进去后,就有了m+n个新坐标,则把每个原来的坐标移到离他最近的新坐标上,就是最小移动距离;而这个距离怎么算呢,因为新的点总原创 2015-01-24 11:10:42 · 662 阅读 · 0 评论 -
uva11464(状态压缩)
题意:给出一个n*n的矩阵,要求每一个位置都是0或者1,,它的上下左右加起来全是偶数;你可以把原矩阵中0改成1,但不能把1改成0.问最少改变几个,不能变成偶阵输出-1思路:假如我们要确定中间某一个元素,是1还是0,那么我们要判断剩下三个元素和是多少.所以我们可以从上往下去推;比如要求g[5][5].那么我们如果从上到下求,我们就已经求出了g[3][5] , g[4][4],g[4]原创 2015-01-26 14:21:33 · 481 阅读 · 0 评论 -
uva11825(状态压缩+dp)
题意:黑客进入了一个网路,这个网络有n台电脑,并且一共有n个服务;每一台电脑你可以攻击它的一个服务,这样它还有和它相邻的电脑这个服务都不能用了;问最多可以让几个服务瘫痪,就是所有电脑都不执行这个服务了;输入有n台电脑;然后是和每台电脑相邻的有几台,分别是哪些;思路:就是把n台电脑看成n个集合,每个集合的成员就是这台电脑,以及和这台电脑相邻的电脑;我们就是要求原创 2015-02-12 13:40:45 · 947 阅读 · 0 评论 -
uva11300(数学)
题意:n个人围成一圈,每个人都有一些硬币,,每个人只能给左右相邻的人硬币,问最少交换几个硬币,使每个人硬币一样多;思路:首先要求出平均数M,每个人的硬币为numi;那么对于1,他能给予4号x1个硬币,并从2号出得到x2个硬币,那么对于1可得numi - x1 + x2 = M;同理可得numn-xn+x1 = M就能得到:x2 =x1-C1 (C1 = n原创 2015-01-24 10:33:49 · 950 阅读 · 0 评论 -
uvalive3882(约瑟夫环)
题意:约瑟夫环;第一个删除第m个,然后每k个删除一个,问最后剩下的一个;思路:因为每删除一个后,我们都可以把剩下的重新编码;当常规的约瑟夫环时,也就是从第一个开始,数k个删除;那么f(n) = (f(n-1) + k) % n;所以第一个数删除m的时候我们算出常规约瑟夫环的解f(n)后;结果就是(m - k + 1 + f(n)) % n;原创 2015-02-11 19:00:59 · 613 阅读 · 0 评论 -
uva11729
题意:现在有n个士兵,你要给n个士兵布置任务;第i个士兵要花bi时间给他布置任务,并且他要花ji时间去完成任务.你一次只能给一个士兵布置任务.但是布置任务的时候,其他士兵可以在做任务,并且可以同时在做任务;问布置任务加完成任务的时间最少是多少;思路:首先可以知道,完成任务时间最长的士兵肯定是先布置任务(这样就能同时做更多事),所以将士兵按任务完成时间从大到小排序,然后算出这个时间就行了原创 2015-01-23 18:52:00 · 618 阅读 · 0 评论 -
uva11292
题意:有n条恶龙,和m个勇士,现在我们要雇佣骑士去杀恶龙;每条恶龙有一个头的长度,每个勇士有一个能力值,只有勇士的能力值大于等于恶龙的头的长度,才能击杀它,每个勇士只能杀一条恶龙,雇佣这个勇士的价格就是他的能力值;问最少要多少钱才能杀掉全部的恶龙,如果不能全杀掉,输出Loowater is doomed!思路:如果勇士数量比恶龙少,当然杀不玩;然后要击杀一条恶龙,最优的就是找一原创 2015-01-23 18:50:16 · 477 阅读 · 0 评论 -
uvalive3266(田忌赛马)
题意:田忌要和国王赛马,双方各有n只马,赢一场得200,输一场,失200,平局不给钱;问怎么安排田忌赚最多;思路:首先第一步肯定是把双方的马都排序,然后先把最慢的马比一下,如果这马比国王快,直接赢下来,如果比国王慢那就用这匹马输给国王最快的马(反正都要输,尽量消耗他);但是如果一样快,就要比较最快的那匹马,如果最快的那匹马比较快,也是直接赢下来,然后比较接下去最快的,如果最原创 2015-02-16 22:01:56 · 807 阅读 · 0 评论 -
uvalive4794(集合+状态压缩)
题意:有一块x*y的巧克力,每次可以切一刀,问切若干刀后(不能两块同时切),可不可以切成n块,面积分别是a1,a2...an;的巧克力:思路:看到final的题就怂了;最后还是参考了大白,还有网上的题解:http://www.cnblogs.com/hlmark/p/4059654.html#include#include#includeusing nam原创 2015-02-13 13:41:03 · 488 阅读 · 0 评论 -
uvalive4254(贪心+优先队列)
题意:有n个任务,每个任务有ri,di,wi;代表任务的[ri,di]代表可以做这个任务的时间区间,而wi代表这个任务的工作量;现在有有个处理器,如果它的执行速度是s,则完成第i个任务所需时间wi/s;要求算出处理器执行过程中最大速度的最小值;思路:首先我们这题可以用二分枚举处理器最大速度,然后判断这个速度能不能满足条件;那么怎么判断是否满足呢?就是按秒模拟时间,现原创 2015-02-14 18:21:04 · 544 阅读 · 0 评论 -
uvalive3667(深搜)
题意:要求给一个尺子刻m个刻度,给出n种距离,都可以由这m个刻度直接量出来,比如你刻了10,15;那么你也可以直接量出5;求最少刻几个刻度,并且尺子尽量短,给出刻度的位置;刻度数思路:这题我们可以确定两个,一个是0,另一个是最大的那个;然后因为刻度最大是7个;我们可以从2开始到7枚举;然后dfs判断是否可以;判断过程就是原创 2015-03-03 10:06:28 · 1065 阅读 · 1 评论 -
hdu5399(计数)
题意:有n个数字,并给出m个函数变化;如果给出的函数变化是-1,代表这个函数不确定,可以任意写;问使f1(f2(......fm(i))) = i;成立的所有情况有几种;思路:现将确定的函数模拟一边;得到的值如果有重复映射,则0种可能,因为一旦又重复映射,我们就不能映射出1到n所有的值;然后看不确定的函数个数;只需要留一个用来做调整,剩下的都是1到n的全排列原创 2015-08-19 15:13:42 · 367 阅读 · 0 评论 -
hdu5400(计数)
题意:给出一个序列;问有几个子区间,满足可以分两段,前一段差d1,后一段差d2;思路:找出所有满足的大区间,这个区间里所有的子区间全部满足;#include #include const int N = 100005;int a[N], n, d1, d2;int main() { while (scanf("%d%d%d", &n, &d1, &原创 2015-08-18 20:22:16 · 444 阅读 · 0 评论 -
uva434(逻辑)
题意:在一个n*n的方正上叠正方体;现在给出前视图,和右视图;问最少几个方块,还有最多在加几个方块(也就是最多减最少);思路:最少的很好求;最小值的话,两个视图,存在高度一样的,就只取一次,高度不一样就两个都取;最大值的话,先看前视图,并假设前视图后面堆满了方块;然后看右视图,右视图中的每一个都要去前视图把多余的高度减掉;例如前视图的2 3 0 1;原创 2015-04-22 22:01:31 · 601 阅读 · 0 评论 -
hdu5014(异或+找区间)
题意:给出一个由0-n这n+1个数字组成的序列;要求你给出另一个序列有0-n组成,让他们一一对应 异或相加的值最大;输出最大值,和你给出的序列;思路:异或完要得到最大值,就应该要二进制是互补的,如10110^01001;我们的最大值是n,所以我们首先要找到和n互补的值是多少,例如找到是c和n互补;那么n-1和c+1互补;n-2和c+2也互补;类推;然后在用c原创 2015-03-11 21:07:47 · 1141 阅读 · 0 评论 -
zoj3811(并查集)
题意:有一个仓库,有很n个点,m条边,还有k个点有传感器;现在给出n,m,k然后给出k个监视器的位置,给出m条边;再输入l,表示总共有k个传感器被触发了(每个传感器只会第一次经过时触发);和触发的顺序;问可以可以把整张图走完 , 并且是按照给出的触发顺序;思路:我们一开始先把触发器所在的点排除,然后把其它点用并查集并起来;然后按顺序一个个把触发器的点放进去;原创 2015-03-07 11:24:28 · 629 阅读 · 0 评论 -
uva11195(回溯+位运算)
题意:八皇后;*的位置不能放;思路:直接回溯会超时,所以用位运算;AC代码:#include#include#includeusing namespace std;const int N = 20;int INF;int n, sum;char g[N][N];int s[N];int dfs(int cur, int d, int原创 2015-03-04 21:21:33 · 362 阅读 · 0 评论 -
uva11389(公车)
题意:有n个公车司机,有n个午班和n个晚班;每个司机必须选择一个午班和一个晚班;每个司机只能开d个小时,如果超过了,每个小时要给r元加班费;现在给出n,d,r;并给出n个午班长度,和n个晚班长度,问交班费最少给多少;;思路; 假如有n是2,d是10;;午班班是3,5;晚班两班是5,7;如果按顺序合并,那么第一个司机3+5=8个小时,第二个司机5+7=12原创 2015-03-04 17:06:36 · 732 阅读 · 0 评论 -
uva10825(暴力)
题意:给出m位的n进制数;要求这个数字乘以2,3...m,都是本身数字的排列;例如6位 ,十进制2 x 142,857 = 285,714 3 x 142,857 = 428,571 4 x 142,857 = 571,428 5 x 142,857 = 714,285 6 x 142,857 = 857,142现在给出m(3 <= m <= 6) ,n;求原创 2015-03-03 21:05:15 · 698 阅读 · 0 评论 -
uva11627(二分 + 模拟)
题意:参加滑雪比赛,我们要从山上滑到山下,并且要经过所有的门;每个门的高度肯定是递减的,从上到下;并且每个门的宽度都是w;你横向滑动的速度是0到vh,随意都可以;现在有s个滑板,每个滑板都有一个纵向滑动的速度;求那个滑板可以通过全部的门,输出最大的速度;思路:首先我们二分枚举滑板的速度,判断是不是可以完成;我们要判断这个速度是不是可以通过所有的门;如原创 2015-03-03 21:34:38 · 574 阅读 · 0 评论 -
uvalive2965(状态压缩)
题意:给出n个由大写字母组成的串;要求选出最多个数的串,并且每个字母个数是偶数;思路:我们只需要祖母个数是偶数,并不需要知道字母几个,所以我们用二进制来代表奇偶性就行了,这里用到状态压缩;这里我们要用到两种状态,一种状态是选择状态,代表哪些字符串是被选中的,还有一种是结果状态,就是这样选择后,字母'A'~'Z'的奇偶型;刚开始我枚举所有的状态,但是超时了;看了题原创 2015-02-10 11:48:28 · 372 阅读 · 0 评论 -
uva10755(降维 +扫描)
题意:有一个长方体,有A*B*C(我们算做长宽高吧)小块组成,每块小块有它的价值,正负都行,问找一块子长方体,价值最大;思路:首先我们要先预处理价值g[i][j][k],表示从高为k,即第k层长到i,宽到j那一块总价值;我们可以知道g[i][j][k] += g[i-1][j][k] + g[i][j-1][k] - g[i-1][j-1][k];意思就是这一块的价值,等于长减一那原创 2015-02-09 21:49:24 · 1192 阅读 · 0 评论 -
uvalive3695(降维+扫描)
题意:给出n个点,让你找一个矩形,是最多的点在矩形边上;思路:看了大白的思路:就是枚举矩形的上下边;然后每次枚举出上下边界,就从左往右扫描描;left[i]表示从这条竖线往左一共几个点在上下两边;on[i]和on2[i]都表示这条竖线上有几个点,on不包括上下边的,而on2包括;AC:#include#include#includeusing na原创 2015-02-09 19:27:39 · 428 阅读 · 0 评论 -
uva11636
题意:给出n,有一个句子,用复制黏贴,问要几次能大于等于n;思路:大水题,每次乘二就行;AC:#include#includeint n;int main() { int cas = 1; while(scanf("%d",&n) && n >= 0) { int cur = 1; int ans = 0; while(cur < n) {原创 2015-01-31 22:29:02 · 376 阅读 · 0 评论 -
uva1335(贪心)
题意:又是看了题解,感觉最近做题都没什么想法出来:有n个人围成一个圈,其中第i个人想要ri个不同的礼物。相邻的两个人可以聊天,炫耀自己的礼物。如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。问:一共需要多少种礼物才能满足所有人的需要?假设每种礼物有无穷多个,不相邻的两个人不会一起聊天,所以即使拿到相同的礼物也没关系。比如,一共有5个人,每个人都要一个礼物,则至少要3种礼物。原创 2015-01-30 15:25:56 · 651 阅读 · 0 评论 -
uva1267(无根树 +dfs)
题意:在一张图中,有n个点,要建几个服务站,服务站可以服务离他距离为k的点;一开始只有一个服务站;现在给出有几组样例,每组样例给出有n个点,最开始的服务站位置start,还有服务站的服务距离dis:思路:首先我们要以最开始的服务站为根,先建一棵树.那么深度为dis的结点就全都可以访问到了;那么哪些结点最有可能访问不到?就是深度最深的;所以我们建好树后,把节点按照从大原创 2015-01-30 13:28:03 · 496 阅读 · 0 评论 -
uva11039(贪心)
题意:要建一栋楼,要求越往上越小,并且相邻的楼层颜色不一样;现在先给出样例数,每组样例给出有几个楼层,然后给出一个数字,正号代表蓝色,负号代表红色,绝对值是大小;问最高建几层;思路:按大小排序,从大到小判断这一层能不能就好,因为最优解肯定是每次都把大的能放的先放进去;#include#include#include#includeusing namesp原创 2015-01-31 22:30:45 · 363 阅读 · 0 评论 -
uva12097
题意:有n块蛋糕,有f个小伙伴,要把蛋糕分给所有人(加上自己一共f+1个人),如果小伙伴发现别人蛋糕比自己多,就会不开心(可怕的小伙伴们!),所以每个人分到蛋糕要一样多,而且分到的只能是一整块(也就是不能用拼的,不能用两块5,凑成10给别人);问每个人最大是多大;输入是蛋糕的数量,人的数量,然后是每块蛋糕半径;思路:思路就是用二分法找满足条件的值.首先我们知道,分蛋糕的最大原创 2015-01-29 12:58:17 · 458 阅读 · 0 评论 -
uva11520(贪心)
题意:有一个n*n的方阵,填充大写字母,有一个要求就是每一个位置和上下左右都不能一样,输入一个方阵,'.'的位置要你填充的,要求字典序最小;思路:挺水的一道题;从第一个位置开始,如果要填充,尽量填最小的,就是'A',判断上下左右,看看能不能填A,能就填,不能就继续判断B行不行;AC:#include#includeconst int N = 15;原创 2015-01-29 13:01:38 · 677 阅读 · 0 评论 -
uva10795(汉莫塔)
题意:给出碟子的数量,然后给出一开始碟子的位置,和最终碟子的位置,问最少移动几次可以完成,要求和普通汉诺塔一样,大的不能叠在小的上面;思路:感觉没看题解完全想不出来这个思路;大体思路就是,你要把最大的盘子从1移到2,那么在这个盘子上面的盘子,还有2上所有的盘子,都要先移到3;然后在移回来;旧汉诺塔:将A柱子上的n个盘子,移到B柱子上旧汉诺塔 f(n)=f原创 2015-01-28 19:20:40 · 2318 阅读 · 0 评论 -
uva11384(简单推理)
题意:有一个1到n的序列,你一次从这个序列中取出几个数字,把他们减去同一个数,问最少做几次,全部变成0;思路:我们每次可以消掉一半,为什么呢;比如是1到10,那么我们第一次把6 到10同时减去5,那么剩下的就是1到5了是不是;也就是序列成为了1,2,3,4,5,1,2,3,4,5;那么在操作也就是不同的数字只剩下5个了,把1消为0,也就会同时把两个1都消为0;原创 2015-01-27 12:41:35 · 852 阅读 · 0 评论 -
uva1352(排列组合)
题意:给你几个正方体,每个正方体的六个面都涂有颜色,现在你要把这些正方体重新涂色,使得所有正方体都一样(六个面颜色相同,正方体可以旋转),问最少重涂几个面;思路:首先,如果正方体不能旋转,那么要怎么涂.很显然,每一面都找出一样的颜色最多的那个颜色,把其他的都涂成这个颜色,那么就是最少的.但是正方体可以旋转,通过计算我们可以知道,每一个正方体有24种旋转方式,而这个道题正方体原创 2015-01-26 16:01:00 · 570 阅读 · 0 评论 -
uva1339(贪心)
题意:给出两个串,问第一个能否通过换位加映射变成另一个;像HAHA和HEHE把H映射到H,把A映射到E就是相等的;思路:统计每字母出现的次数;按次序拍序;如果出现只出现一次的字母一样多,两次的一样多,n次的一样多,那么就可以转换;#include#include#includeusing namespace std;const int N原创 2015-02-01 18:09:06 · 569 阅读 · 0 评论 -
uva1368(贪心)
题意:给出很多DNA序列,每个长度一样;让你找出一个序列,与这些序列相差最小,最小相差多少;思路:就是取所有串第一位中出现最多的,作为结果的第一位,并算出不是这个字母的有几个..一直推到最后一位;#include#include#includeusing namespace std;char dna[55][1005];char ans[1005];int r原创 2015-02-01 18:01:48 · 654 阅读 · 0 评论 -
uva1346(排序)
题意:有n首播放个曲, 每首歌曲有识别符key,歌曲长度l,以及播放频率q。要把歌曲重新排列,方便播放,播放所有歌曲有一个复杂度的计算∑(1≤i≤n)q[i] * ( ∑(1≤j≤i)l[j] ), 然后给出S,请输出重新排列后的第S首歌的识别码。思路:为了使得复杂度越小,很明显的曲目长度小的要放前面,播放频率小的要放后面,所以每首歌增加一个k = l / q,即k越小的越在前原创 2015-02-03 18:19:06 · 571 阅读 · 0 评论 -
uvalive4094
题意:一个足球联赛,每个队要和另外所有队踢两场;胜利3分,平局1分,失利0分;最后出了要决出冠军,还要决出一个wonder team,就是胜场最多,进球最多,失球最少(都不能有并列)(胜场最多不一定排名高,因为它可能输了很多,平局很少,别人都是平局,积分就比它多),问wonder team排名最靠后是多少;思路:首先胜场多,排名靠后,那么只有一个原因,它平局很少,赢了几场,原创 2015-02-16 23:41:58 · 887 阅读 · 0 评论 -
uvalive3029(扫描图)
题意:给出一个矩阵,F代表空地,R代表障碍;问最大的空地矩阵(就有F组成的矩形)有多大,输出面积乘以3;思路:看了大白的思路;就是扫描这张图,判断每一个点,它向上延伸,空地有多大,向左延伸,向右延伸空地有多大;然后就能计算这个点所在的矩形有多大,更新最大值即可:#include#include#includeusing namespace std;原创 2015-02-08 20:36:25 · 419 阅读 · 0 评论 -
uva10317(dfs)
题意:给出一个式子,不一定正确,要求移动数字的位置使变成正确的;思路:首先我们要算出正确的式子两边是和是多少;例如a+b-c= d-e变成a+b-c-d+e = 0;把所有的加项放在一起,减项放在一起得到(a+b+e)-(c+d)=0;也就是a+b+e = c+d;所以等式两边应该是所有数的绝对值之和的一半;所以我们只要算出整个式子有多少个负数,我们df原创 2015-02-06 19:00:57 · 425 阅读 · 0 评论