高效算法
big up
这个作者很懒,什么都没留下…
展开
-
uvalive3610
题目大意: 给出n个块,每个长度为k,给出n个左起点,只要有重叠部分就可以相互跨越,问点数最多的环,并输出点数思路: 首先将左起点排序,往后面找,判断第i + 1个可不可以加进去前面的阵营 可以形成环的条件:x[i + 1] - x[i - 1] <= k && x[i + 1] - x[i] <= k 代码:#include <iostream>using namespace std;原创 2016-05-10 23:33:45 · 265 阅读 · 0 评论 -
uva10341
题目大意: 求出满足等式的x思路: 如果formula(a) * formula(b) < 0 那么就是有解的。利用二分进行查找代码:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <cmath>#define MIN (10e-8)double p,q,r,s,t原创 2015-12-26 21:07:25 · 273 阅读 · 0 评论 -
uva270
题目大意: 找出一组数据红在同一个直线上的最多的点的个数思路:去求斜率 代码:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <algorithm>struct node { float x,y;}n[705];int num;double nn[705]原创 2015-12-26 21:04:35 · 199 阅读 · 0 评论 -
uva10132
题目大意: 有几个相同的字符串,都被摔成了两个串,题目给出这些串,求最初始的串是什么 自己的代码WA了,别人的代码 代码:#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 310#define LEN 610char word[LEN];struct file{原创 2015-12-26 21:02:45 · 353 阅读 · 0 评论 -
uva10763
题目大意: 进行交换,要满足两两都可以交换,即它空缺出来的位置必须有人填充,自己想去的位置必须是空的。思路: 就设一个grid数组 如果空缺出来就-1,如果想填充就+1; 最后遍历 是否所有的grid都为0 如果是的话就输出YES,否就输出NO代码:#include <iostream>using namespace std;#include <stdio.h>#include <cst原创 2015-12-26 20:57:57 · 329 阅读 · 0 评论 -
uva10905
题目大意: 给出的数字中 组成一个最大的思路: 按a+b > b+a 排序 然后直接将排完序的字符号输出就可以了。代码:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <algorithm>string num[55];int cmp(string a,strin原创 2015-12-26 20:55:23 · 215 阅读 · 0 评论 -
uva10714
题目大意: 给定一段长度,蚂蚁走到两端边缘的话就会往下掉。如果两只蚂蚁相遇了,那么他们都会分别掉头走,给出了蚂蚁的起始坐标,蚂蚁往哪个方向走不确定,求所有蚂蚁掉下去的最短时间和最长时间。思路:其实蚂蚁有没有掉头走,都是走一样的长度的路。 所以掉头和没有掉头其实是等价的。 所以最快的话,就是每个蚂蚁都往离自己比较近的那端走,这样是不会相遇的 。最后掉下去的蚂蚁的时间就是最快的时间。 最慢的话就原创 2015-12-26 20:36:47 · 359 阅读 · 0 评论 -
uva10020
题目大意: 数轴上有n个闭区间,选择尽量少的区间覆盖【0,M】思路: 小白 154页 区间覆盖问题 贪心首先,在区间外的区间需要去掉,只保存有包含在所求区间的区间。 然后将保存下来的区间从小到大排序,如果第一个区间的x大于0的话,就表示无解。否则,找到比0小的x,尽量找最长的(贪心思想,这样就可以找到最短的了),找到满足的最长的之后,新的起点设置为它的y坐标,并且忽略所有区间在y之间的部分。代原创 2015-12-26 19:55:09 · 313 阅读 · 0 评论 -
关于lower_bound 和upper_bound
在uva10487 中我用到了这个函数,所以就去看了一下这个函数。。大神介绍的: STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法。 ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于原创 2015-12-26 18:55:34 · 1147 阅读 · 0 评论 -
uva10057
题目大意: 求中位数思路: 如果是奇数个 ,中位数只有一个,找到与中位数相等的都可以, 如果是偶数个,中位数有两个,找到与这两个相等的都可以。代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#include <algorithm>const int MAXN = 1000000;原创 2015-12-26 21:09:17 · 296 阅读 · 0 评论 -
uva10487
题目大意: 给出的数中,任意两个数相加,找出最接近query的数。思路: 把任意两个数加起来之后,排序完之后,用lower_bound找到插入query的位置,然后找到它左右两边的与它最近的数。输出就可以了。代码:#include <iostream>#include <cstdio>using namespace std;#include <cstring>#include <algo原创 2015-12-26 21:12:11 · 359 阅读 · 0 评论 -
LA3882
题目大意: 从第m个开始删除,每隔k个就删除一个,求最后一个留下的。思路: 假设从0开始删除,那么没隔k个删除一个的话 f数组存的是最后留下的数字编号。 则f(1) = 0,f(n) = (f(n - 1) + k)%n 因为删除的人的后一个的编号变成了0 最后胜利的人不断+k就可以还原为原来的编号。 不过该题要求编号从1开始,只要把f[n]+1即可,同时,该题指定了第一个要删除的人必原创 2016-01-28 15:26:03 · 584 阅读 · 0 评论 -
LA3693
题意:在给出的16个数中,求使得满足 x1* 4 + x2* 3 + x3* 2 + x4 = x5 + x6* 2 + x7* 3 + x8* 4 y1* 4 + y2* 3 + y3* 2 + y4 = y5 + y6* 2 + y7* 3 + y8* 4思路: 先将数字进行排序,枚举四位数字,将所有等于temp的状态存入val[temp][i]中,然后判断i & val[temp][j]原创 2016-03-31 12:31:50 · 229 阅读 · 0 评论 -
uva10382
题目大意: 最少要用多少个给定的圆才能把长度为l,宽度为w的完全覆盖住。思路: 刚开始想到的是区间覆盖问题 可以WA了,后来又改了以下结果超时了 T.T 求帮忙代码: TLE:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <cmath>int N;double原创 2015-12-28 20:02:20 · 490 阅读 · 0 评论 -
uva10970
题目大意: 求将巧克力切成1*1的最少刀数。代码:#include <stdio.h>int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { printf("%d\n",(n - 1) + n * (m - 1)); }}原创 2016-01-29 14:54:36 · 314 阅读 · 0 评论 -
LA3213
题目大意: 找到一个映射 使得两个字符串相同如果可以找到输出YES,反之输出NO思路: 刚开始以为一定要按顺序一一对应,发现第一组数据答案是错的,后来才知道不一定要按照顺序。 那么只需要计算每个字母的个数,比较字母个数是否一样如果全部一样就可以找得到映射。代码:#include <iostream>using namespace std;#include <stdio.h>#include原创 2016-01-29 14:47:10 · 319 阅读 · 0 评论 -
uva11039
题目大意: 求正负交错且绝对值递增的最长序列思路: 本来想说分成两个正负数组,然后有点类似归并排序的那种思想,可是发现好混乱。 后来看见人家是做标记的。。。太简单了。。代码:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <algorithm>int a[50000原创 2016-01-29 14:10:00 · 456 阅读 · 0 评论 -
uva10755
题目大意: 求三维矩阵的和最大的子矩阵。思路: 和某一题求最大和的很像,只不过这一题是三维的,那一题是二维的。通过枚举开始结束的行列和层数进行降维。代码:#include <iostream>using namespace std;#include <cstring>#include <algorithm>#include <stdio.h>const int maxn = 30;co原创 2016-01-28 14:16:54 · 591 阅读 · 0 评论 -
LA3695
题目大意: 求出一个矩形可以包含的最多的星星的数量。思路: 用left数组存位于i左边的上下边界的数量,on数组存不包括上下边界的竖线上包含几个星星,用on2数组存包括上下边界的竖线上包含几个星星。边界上的星星数量就是left[j] - left[i] + on2[j]+on[i]。枚举上下边界,用一个循环求on[i] - left[i]的最大值+上left[j]+on2[j] 相当于枚举左右边原创 2016-01-28 11:39:13 · 419 阅读 · 0 评论 -
逆序对数的计算
使用“分治三步法” : 划分,递归,合并。类似与归并排序,我们只看右边的元素,计算右边的元素的逆序对。当右边的数组A中的一个元素j要合并到T数组中去的时候 左边数组中还没复制到T数组中的元素都是比A[j]还要大的元素。 只要把总数/2 - 左边已经合并的元素就是对于A【j】存在的逆序对数的个数。原创 2015-12-26 18:44:57 · 896 阅读 · 0 评论 -
uva714
题目大意: 按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间),如果有多种可能的话,尽量在前面进行划分。思路: 最大值最小化的问题,利用二分法,下界是0 上界是所有数字的和。然后去查找小于等于mid可以划分为几组,如果可以划分的组数大于M的话,那么就表示说这个值太小了,应该l = mid原创 2015-12-27 20:26:05 · 619 阅读 · 0 评论 -
uva10954
题目大意: 类似于哈夫曼编码,要求出最小的花费。思路:刚开始天真的以为只要把最前面的两个加起来就可以了。。后来发现要排序了才可以,然后就想到每次都去排序一次,后来看见题解是用优先级队列实现最小堆的,所以只要用个greater每次都会自动排序了。代码:#include <iostream>using namespace std;#include <cstdio>#include <cstrin原创 2015-12-27 14:29:50 · 531 阅读 · 0 评论 -
uva10716
题目大意: 找到最少的步数可以使得所给字符串变成回文,可以变成回文就输出步数,不能的话就输出Impossible。思路: 刚开始想说,左边完全不动,右边去满足左边的,看了题解之后,是找到最两端满足条件的最少步数的字符之后,开始向内缩小区间,以此类推。代码:#include <iostream>using namespace std;#include <cstring>#include <s原创 2015-12-29 23:19:55 · 273 阅读 · 0 评论 -
uva10720
题目大意: 知道各个节点的度,判断该图是否为简单图。思路: 本来想说奇数度的节点偶数个就可以保证这是个简单图,可以是错的。应该找出度数最大(M)的点,让后面的M个点度数–,如果有出现<0的那么必然就不能构成简单图。代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#include <原创 2015-12-29 22:40:23 · 252 阅读 · 0 评论 -
uva993
题目大意: 给出一个数字,找出最小的可以满足每个数乘积等于它的数。思路:从9到2的找,因为这样才可以保证尽可能的小,不断的求余。代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>int main() { int cases,N,Q,count1,a[10]; bool fl原创 2015-12-29 19:17:10 · 257 阅读 · 0 评论 -
uva11100
题目大意: 有几个包裹,包裹之间是有互相包含关系的,求最少的箱子数可以将所有包裹都放进去。思路: 最多的重复个数k就需要几个箱子,因为相同的之间是不可以相互包含的。将包裹进行排序,然后从一个数i,每加K就是放在同一个箱子中的,照着这个样子输出就可以了。代码:#include <iostream>using namespace std;#include <cstdio>#include <c原创 2015-12-28 23:18:54 · 550 阅读 · 0 评论 -
uva10670
题目大意: 给出起始的工作量,和目标的工作量 还有完成一个单元需要给的钱,或者完成全部的一半需要给的钱。怎样选择才可以使雇用的钱数最少。最后按照费用从小到大排序,如果一样大的就按照名字的字典顺序排序。思路:如果剩下的小于M的话,就用完成一个单元的方案,题目规定的。 如果一半*A大于B的话那么就用B,小于的话就用A。代码:#include <iostream>using namespace st原创 2015-12-28 18:06:33 · 234 阅读 · 0 评论 -
uva11054
题目大意:正数代表的是需要的酒的数量,负数代表的是要卖出的酒的数量,酒店之间都是线性排列的,相邻两个酒店之间的距离都是1。求花最少的费用去交易买卖来满足所有酒店的需求。思路:要使得路费最少的话,利用贪心的思想,就让相邻的两个酒店之间进行交易,不管他们是否可以满足各自的要求,只需要先让前一个满足就可以了。这样路费就只是酒*1,本来想说的是正数去寻找最近的负数的,可是这题的数据量有点大,所以可能会超时,原创 2015-12-28 15:39:56 · 355 阅读 · 0 评论 -
uva10718
题目大意: 给出N,L,U,找到一个M,让M|N位运算可以最大,满足这个条件的同时要使得M最小。思路: 先将2的0 - 32次方存放到一个数组中,由于没有符号的32位的整数最大为2^32 -1,所以必须存到2^32次方,此时注意要用上longlong 否则就错误了,如果N中的位为0的时候,M必须尽可能的等于1,这样才可以保证M|N最大,但是此时要判断M为1的最小值是否已经超过了U,同理,当N中的原创 2015-12-28 15:11:40 · 242 阅读 · 0 评论 -
uva10400
题目大意: 运算符号没有优先级的,给出的数字按顺序利用+ - * / 将结果得出来,如果的不出结果就输出无解。思路: 感觉可以直接dfs代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#include <cmath>int p[105],flag,vis[105][64001],n原创 2015-12-27 23:03:35 · 224 阅读 · 0 评论 -
uva10245
“题目大意: 找出最近的点的距离。如果距离大于10000 就等同于INFINITY思路: 刚开始想说直接暴力的,但是看了数据觉得会超时, 所以就去看了题解。第一次做分治问题。代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#include <algorithm>#include原创 2015-12-30 16:24:35 · 357 阅读 · 0 评论 -
uva11129
题目大意: 构成一个任意一个大于2的子序列都不是等差数列的序列。思路: 刚开始完全都没有思路,后来看了题解才懂的。 例如 0 1 2 3 4 ,先变成呢个 0 2 4 1 3 然后再递归的解决变成 0 4 2 3 1代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#define原创 2015-12-30 17:04:43 · 357 阅读 · 0 评论 -
LA3905
题目大意: 给你一个矩形照相机和n个流星的初始位置和速度,求能找到流星最多的时刻,边界上的点不算入内。思路: 线性扫描 + 事件点处理 可以以时间为轴,计算每个流星出现的时间然后化成平行于x轴的线段,用一根竖线进行扫描,扫描到最多的时刻记录下来每次更新。代码:#include <iostream>using namespace std;#include <stdio.h>#include原创 2016-01-27 11:38:00 · 308 阅读 · 0 评论 -
LA3029
题目大意: 求空地F的最大矩形,求最大子矩阵思路: 用三个数组up,l,r分别表示举行的高度,左边界,右边界。 lo 表示左边最近障碍格的列编号。 ro表示右边最近障碍格的列编号。 先从左到右维护左边界。 如果是有障碍的话 那么up [i][j] = 0,l[i][j] = 0,lo = j; 当i是第一行的时候 如果没有障碍的话 那么up[i][j] = 1,l[i][j] = l原创 2016-01-25 15:17:49 · 337 阅读 · 0 评论 -
uva12124
题目大意: 组装一台电脑,每个配件都需要买一个,总价格不可以超过b,且品质最差配件的品质因子要尽量的大。思路: 最小值最大化的问题,用二分法,二分法分的是最低的品质因子的范围,判断函数写的是所有的品质因子大于k的时候是否可以组装成电脑,如果可以的话就继续往品质因子大的取,如果不行就要往小的取。代码:#include <iostream>using namespace std;#include原创 2016-01-22 16:24:35 · 547 阅读 · 0 评论 -
uva10827
题目大意: uva108的升华,此时是可以缠绕的。第一行可以变成最后一行,最后一行也可以变成第一行,第一列可以变成最后一列,最后一列也可以变成第一列。思路:将四个矩阵拼接在一起那么就可以枚举出可能了。代码:#include <iostream>using namespace std;#include <cstring>#include <stdio.h>int a[200][200],sum原创 2016-01-02 19:02:32 · 566 阅读 · 0 评论 -
uva108
题目大意: 在给出的矩阵当中,找出一个子矩形矩阵可以使得里面加起来的值是所有子矩阵中最大的。思路: 将num数组初始化为一个把在自己的行数之前的同一列的值都加起来的一个数组。那么num[i][j] 表示的就是一个<=i行 且第j列的值都加起来的一个值。用三层for,枚举出两个矩形的起始行号,以及列数。这样那个就可以枚举出所有的可能。代码:#include <iostream>using nam原创 2016-01-02 19:00:35 · 415 阅读 · 0 评论 -
uva507
题目大意: 一段公交车路,各个车站为1,2,3…s, 各个车站之间的景色值是不同的, 求一段连续的车站的景色值之和最大是多少。思路: http://blog.csdn.net/hcbbt/article/details/10454947代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstrin原创 2015-12-30 21:58:15 · 257 阅读 · 0 评论 -
uva507
题目大意: 一段公交车路,各个车站为1,2,3…s, 各个车站之间的景色值是不同的, 求一段连续的车站的景色值之和最大是多少。思路: http://blog.csdn.net/hcbbt/article/details/10454947代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstrin原创 2015-12-30 20:48:00 · 398 阅读 · 0 评论 -
uva10041
题目大意: 求vito到各个邻居家的距离和要最小,最小为多少。思路: 本来想说求平均数的,可惜WA了,后来想了个样例,1 2 2 2 2 2 , 11/6 = 1的,其实要选择住在2距离才会最短。所以这题要求的是中位数。代码:#include <iostream> using namespace std;#include <cstring>#include <stdio.h>#incl原创 2015-12-30 17:33:59 · 393 阅读 · 0 评论