高效算法设计
Ziiyan
这个作者很懒,什么都没留下…
展开
-
UVA - 10905 Children's Game
题目大意:题意很好懂,问所给数字能组成的最大数是多少。 解题思路:主要是一个编写排序函数 cmp 的技巧,单纯按大小排序再组合显然是行不通的:如 9、90,90 > 9,但显然 909 < 990。这里选择两两组合比较就很简单。#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdli原创 2016-11-16 00:17:17 · 222 阅读 · 0 评论 -
UVA - 11100 The Trip, 2007
题目大意:给出行李箱的尺寸,小箱子能装在大箱子里,问装完后最少有几个箱子,并且每份箱子个数最少,并输出出组合方式。 解题思路:显然相同大小的行李箱必须分开放,所以最后箱子的个数就是重复出现最多次的尺寸。要实现每份箱子个数最少均分即可,就每隔这个数字输出,保证相同尺寸的行李箱不会组合在一起。#include<iostream>#include<stdio.h>#include<algorithm原创 2017-07-11 19:03:42 · 195 阅读 · 0 评论 -
UVA - 10382 Watering Grass (区间覆盖 贪心)
题目大意:长 l 宽 w 的草坪,有 n 个喷洒器,给出喷洒器圆心坐标和半径,问最少用几个喷洒器能保证覆盖所有草坪。 解题思路:需要转换一下 对于任意一个喷洒器,利用半径和宽极坐标求出图中红线的左右两端坐标,就转换为简单的区间覆盖,然后利用贪心思想即可。注意直径小于宽的情况可以直接排除。#include<iostream>#include<stdio.h>#include<algorit原创 2017-07-09 10:11:48 · 245 阅读 · 0 评论 -
UVA - 10670 Work Reduction (贪心)
题目大意:N 份工作要求下班时正好剩余 M,现在有 L 家代理公司可供选择。每家代理公司都有两种方案,一种是解决一份花费A,另一种是解决当前工作量的一半(四舍五入)花费B,问每家公司的最小花费。输出按照费用升序,费用相同的情况下按照公司名称的字典序。 解题思路:贪心,选择当前最优方案即可。先计算一下当前工作量的一半是多少件,判断减去这些是否还大于 M,如果不是直接选择一件一件减到 M 就可以了。比原创 2017-07-09 10:27:55 · 219 阅读 · 0 评论 -
UVA - 993 Product of digits (贪心)
题目大意:求一个最小的 Q 使得 Q 的每位数字的乘积等于 N product - 乘积……大概是题英语阅读理解 解题思路:求 N 的因数,从 9 判断到 2,逆序输出即可#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>using namespace std;原创 2017-07-09 10:33:23 · 173 阅读 · 0 评论 -
UVA - 10245 The Closest Pair Problem
题目大意:给 N 个点,输出最小距离。最小距离超过 10000 输出 INFINITY 解题思路:暴力QwQ#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>const int INF = 0x3f3f3f3f;const int NINF = -INF -1;原创 2017-07-11 19:07:14 · 191 阅读 · 0 评论 -
UVA - 10041 Vito's Family (中位数)
题目大意:vito 的 r 个家人们住在街道 si_i……sr_r,问 vito 住在哪个街道去拜访亲戚的总距离最短,输出最短的总距离。距离dij_{ij}=|si_i-sj_j|。 解题思路:取中位数,求各个数的差再求和#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.原创 2017-07-13 10:57:06 · 239 阅读 · 0 评论 -
UVA - 507 Jill Rides Again(连续子序列最大和)
题目大意:jill 骑行时每段路有一个好感值,可以先搭公交在任意站点下车再开始骑行,直到到达任意目的地,问骑哪段路得到的好感值最大。 解题思路:直觉就是暴力,O(n2^2)超时了,查题解,学习了最大子序列和问题 by 在hust快乐的学习,一步一步分析优化写的非常好。#include<iostream>#include<stdio.h>#include<algorithm>#include<原创 2017-07-14 11:08:24 · 297 阅读 · 0 评论 -
UVA - 108 Maximum Sum(子矩阵最大和)
UVA - 507 Jill Rides Again(连续子序列最大和)升级版 题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和。 解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行。#include<iostream>#include<stdio.h>#include<algorithm>#i原创 2017-07-14 11:24:03 · 269 阅读 · 0 评论 -
UVA - 10827 Maximum sum on a torus
UVA - 108 Maximum Sum(子矩阵最大和) 升级版题目大意:和 UVA - 108 差不多,不同在于可以把此题想象成球面,不设边界。 解题思路:把边界拓展一下,四个矩阵拼在一起,就可以枚举出所有情况。注意控制一下子矩阵的大小 N×N。#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#原创 2017-07-14 11:29:29 · 263 阅读 · 0 评论 -
UVA - 757 Gone Fishing (贪心)
题目大意:John 有 h 小时钓鱼,一共有 n 个湖,他最开始在第一个湖,给出以下信息,问总时长 h 小时内最多能钓多少鱼,并输出每个湖钓多久。 每组样例有五个部分: 1)n 个湖 2)h 小时 3)fi_i 第 i 个湖第一个五分钟能钓到的鱼的数量 4)di_i 第 i 个湖每五分钟减少的鱼的数量 5)ti_i 第 i 个湖到第 i+1 个湖所需要的单位时间(单位为 5 分钟) 解原创 2017-07-15 19:03:31 · 256 阅读 · 0 评论 -
UVA - 10148 Advertisement(贪心 区间选点)
题目大意:一条路上有若干广告位, 给出 N 个跑者跑步的区间,要求每个跑者至少能看到 K 个广告,若跑步范围不到 K 则区间内都要投放,问最少要投放多少个广告,并输出坐标。 解题思路:区间选点问题,先根据区间右端排升序,从右端开始选 k 个点标记,因为下一个区间很可能会覆盖到之前区间的右端,这样就能重复利用。对于下一个区间,先统计已经被标记过的点,不足 k 个的再从当前区间的右端开始选点补足。之后原创 2017-07-15 19:14:41 · 289 阅读 · 0 评论 -
UVA - 11054 Wine trading in Gergovia
题目大意:一条街上连续住着n户人,相邻两家相隔距离是一个单位。进行葡萄酒交易,负数表示需要买,正数表示需要卖,最后要求每家都是0,运费=交易量*距离,求最小花销。 解题思路:一开始想到是模拟,但是其实不用。因为每家都要求最后为0,直接把第一家的运送到第二家即可,那么运费就是ans+=a[0]*1,若是负数则表示第二家运送a[0]酒到第一家的花销,也是一样的,这样就能保证满足要求,接着再往下处理,后原创 2017-01-15 13:52:59 · 314 阅读 · 0 评论 -
UVA - 10400 Game Show Math
题目大意:类似于24点,给数字和目标数,通过四则运算求得目标数,输出式子。此题中,运算符没有优先级,遵循从左至右运算;除号在能够整除的时候才能用;运算过程数字要在 -32000~32000 范围内。 解题思路:dfs + 判重#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib原创 2016-11-24 15:38:59 · 250 阅读 · 0 评论 -
UVA - 10602 Editor Nottoobad
题目大意:给出一系列单词,可以重复上一个单词、删除单词尾部字母、键入字母,每键入一个字母算按键盘一次,别的操作不记数,第一个单词必须先输入,剩余单词顺序可随意,问输入这些单词最少需要按多少次键盘。 解题思路:因为允许重复上一个单词和删除尾部字母,那么当前单词和上一个单词的前缀最相似的情况下,键入次数会最少,按照这个思路去排序,然后统计一下不同的字母个数就是答案。#include<iostream>原创 2016-11-24 14:16:05 · 160 阅读 · 0 评论 -
UVA - 10763 Foreign Exchange
题目大意:给出 N 组数,若所有 A,B 都有出现对应的 B,A 即 YES,否则 NO。 解题思路:思路蛮简单,一开始直接做没去排序自然是 TLE……根据 N 的奇偶也可以剪枝一下,显然要成对出现才有可能满足条件。#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#原创 2016-11-16 00:37:00 · 165 阅读 · 0 评论 -
UVA - 10132 File Fragmentation
题目大意:有一些相同的文件,被分成两个部分,即给出的 2N 行 01 串共组成 N个相同的文件。输出原文件。题目保证有解。 解题思路:既然都是相同文件那么长度肯定相同,那么最长串就要和最短串组合,枚举所有情况去判断剩余串是否能够恰好组成 N-1 组该串,若成功输出即可。#include<iostream> #include<cstdio>#include<cmath>#include<str原创 2016-11-16 20:17:46 · 202 阅读 · 0 评论 -
UVA - 270 Lining Up
题目大意:给出一些点,问最多有几个点共线。 解题思路:用斜率相等判断共线,首先斜率 k=y1−y2x1−x2k=\frac{y_{1}-y_{2}}{x_{1}-x_{2}},对于三点 y1−y2x1−x2=y1−y3x1−x3\frac{y_{1}-y_{2}}{x_{1}-x_{2}}=\frac{y_{1}-y_{3}}{x_{1}-x_{3}} 即三点共线,这里交叉相乘即得到(y1−y2)原创 2016-11-17 14:05:41 · 206 阅读 · 0 评论 -
UVA - 10341 Solve It
题目大意:根据题目所给公式,求 0~1 范围内的 X 解题思路:二分#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#include<algorithm>#include<queue>#include<map>using namespace std;doub原创 2016-11-17 14:20:23 · 235 阅读 · 0 评论 -
UVA - 10057 A mid-summer night's dream.
题目大意:给出一组数(X1,X2…Xn)(X_{1},X_{2}…X_{n}),求一个数 A 使得 (|X1−A|+|X2−A|+…+|Xn−A|)(|X_{1}-A| + |X_{2}-A| + … + |X_{n}-A|) 最小,输出三个数:第一个是最小的A,第二个数是数列 Xn{X_{n}} 中有多少个数可以是 A,第三个数是 A 的总个数( A 不一定在 Xn{X_{n}} 中) 解题思原创 2016-11-17 15:34:20 · 184 阅读 · 0 评论 -
UVA - 10487 Closest Sums
题目大意:输入一个 n,以下 n 行给出 n 个数,然后输入一个 m,以下 m 行给出 m 个被询问的数,求 n 个数任意两两相加的和中最接近被询问的数是多少。 解题思路:sum 记任意两数和,减去被询问的数,绝对值最小的即所求值。#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<std原创 2016-11-18 22:14:21 · 196 阅读 · 0 评论 -
UVA - 10700 Camel trading
题目大意:给出一个只有 + 和 * 的式子,求出不同运算顺序下得到的答案中的最大值和最小值。 解题思路:显然先加再乘最大,先乘再加最小。开两个栈去存储。上个月数据结构刚学的用栈转后缀计算,毕竟这个只有两种就不用那么复杂了。注意一下这题数据比较大要用 long long #include<iostream> #include<cstdio>#include<cmath>#include<str原创 2016-11-20 15:02:06 · 248 阅读 · 0 评论 -
UVA - 10026 Shoemaker's Problem
题目大意:鞋匠有许多鞋要做,但每次只能做一双鞋,别的鞋子在开始之前都需要赔偿延期的费用,给出每个单子需要的天数和延期一天所需要赔的费用,输出赔偿最少的情况的顺序。 解题思路:贪心,考虑只有两双鞋的顺序,若 a b 那么所需费用就是 b 的费用×a 的天数,若 b a 则是 a 的费用×b 的天数,比较两种费用选择费用少的那种顺序。#include<iostream> #include<cstdi原创 2016-11-20 15:40:26 · 256 阅读 · 0 评论 -
UVA - 311 Packets
题目大意:有 1×1、2×2、3×3……6×6 的高度相同的包裹要放进6×6的箱子里,问最少需要多少个箱子。 解题思路:贪心,先放大的包裹。 每个箱子可以放: 1 个 6×6 1 个 5×5 + 11 个 1×1 1 个 4×4 + 5 个 2×2 4 个 3×3 或 3 个 3×3 + 1 个 2×2 + 5 个 1×1 或 2 个 3×3 + 3 个 2×2 + 6 个 1×1原创 2016-11-22 23:16:35 · 327 阅读 · 0 评论 -
UVA - 10714 Ants
题目大意:一根棍子上有一些蚂蚁,相遇会掉头,求掉下所有蚂蚁都掉下棍子的最长时间和最短时间。 解题思路:眼熟的题目(UVA - 10881 Piotr’s Ants )而且这题简单多了#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#include<algorithm原创 2016-11-23 16:41:21 · 290 阅读 · 0 评论 -
UVA - 10954 Add All
题目大意:给出一些数字,两两相加,把和代替两个数字放回原列,再继续两两相加。求最小和。 解题思路:正巧前两天学的哈夫曼树,一个思想,于是优先挑选最小的两个数,用优先队列不难实现#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#include<algorithm>#原创 2016-11-23 17:02:04 · 241 阅读 · 0 评论 -
UVA - 11129 An antiarithmetic permutation(分治)
题目大意:用 0, 1, 2……n 构造一个序列,要求任意一个大于 2 的子序列不能是等差数列。(0, 5, 4, 3, 1, 2) 不符合要求,因为子序列 (0, 1, 2) 和 (5, 3, 1) 是等差数列。 解题思路:没什么思路,查的题解。 把序列按奇偶位分成两列再合并,这样能保证分成的两个序列内部等差,但加入另一序列的任意数字后不等差。将能够等差的新序列长度拆分至小于等于 2 即可,这原创 2017-07-15 18:40:33 · 251 阅读 · 0 评论