
ACM 刷题录
ACM-ICPC的题解,内容包括问题链接、问题分析、解题心得和AC通过的程序。
冰阔落
Stay hungry, Stay foolish, Stop when you are perfect.
展开
-
【索引】AOAPC I: Beginning Algorithm Contests (Rujia Liu)
AOAPC I: Beginning Algorithm Contests (Rujia Liu)原创 2014-08-09 09:20:25 · 3585 阅读 · 0 评论 -
【索引】 AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu)
AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu)Chapter 1. Algorithm DesignChapter 2. MathematicsChapter 3. Data StructuresChapter 4. GeometryChapter 5. Graph TheoryChapte原创 2015-04-19 15:31:17 · 3596 阅读 · 0 评论 -
hiho一下 第五十八周
题意分析给定字符串S,判定S是否存在子串S’满足”aa…abb…bcc…c”的形式。其中abc为连续的三个字母,且a,b,c的数量相同。原题目中数量相等的连续n(n>3)个字母也是可行的,而实际上当n>3时一定包含有n=3的情况。比如”abcd”就包含有”abc”和”bcd”两个合法子串。算法分析最基本的思路为对S的每一个子串进行判定是否满足要求。枚举子串的起点、终点以及检查是否合法。假设S的长度为原创 2015-09-28 23:41:32 · 1634 阅读 · 0 评论 -
hiho一下 第五十九周
题意分析给定一个单线程程序运行的记录,包含有每个函数启动和结束的时间。判定该份记录是否错误,主要的错误包含:记录中的时间不是严格递增的一个函数的结束时间比启动时间更早记录中一个函数有不对应的启动操作START或结束操作END,比如出现了START却没有对应的END,或出现了END却没有出现START。而函数的START和END应该成对出现两个函数出现交叉的情况,而在单线程程序中是不会出现的,原创 2015-09-28 23:49:39 · 1498 阅读 · 0 评论 -
hiho一下 第六十周
题意分析给定只包含字母的两个字符串A,B,求A,B两个字符串的最长公共子序列,要求构成子序列的子串长度都必须大于等于3。比如”abcdefghijklmn”和”ababceghjklmn”,其最长满足题意要求的子序列为”abcjklmn”,其由公共子串”abc”和”jklmn”组成。这里我们要注意子串和子序列的区别:子串:连续的元素子序列:不连续的元素比如”abcdefghijklmn”和”a原创 2015-09-28 23:54:40 · 1505 阅读 · 0 评论 -
hiho一下 第六十一周
题意分析给定一个字符串s,以及对该字符串s的 m 个操作。字符串s包含n个字符,下标为1..n。字符由’A’到’Z’构成,字符增加1表示该字符变为后续字符,比如’A’增加1是’B’,’C’增加1是’D’。需要注意的是’Z’增加1是’A’。m个操作包含以下四种类型:将字符串第i位到第j位设定为C。比如当i=2,j=3,C=’Z’时:”ABCDEFG”变成”AZZDEFG”将字符串第i位到第j位增加原创 2015-09-29 00:05:22 · 1607 阅读 · 0 评论 -
hiho一下 第六十二周
题意分析在浏览网页的时候,缓存技术能够迅速地显示页面。这里我们对浏览器的缓存技术进行简化:我们认为浏览器的缓存大小为M,表示缓存可以存储M个页面。当用户访问URL时,浏览器会先到缓存中查询是否有该页面的记录,如果有则直接从缓存中提取数据;否则,会发送网络请求,从Internet获取该页面,并将该页面放入缓存中。当缓存中的页面数量超过M时,缓存技术会替换掉缓存中最不频繁访问的网页,即最后访问时间最早的原创 2015-09-29 00:13:34 · 1619 阅读 · 0 评论 -
hiho一下 第六十三周
题意分析给定一个有向图,求图中哈密顿回路的数量。算法分析哈密顿回路,具体到本题中即从某一个点开始经过所有的点一次后再回到该点的不同路径数。对于这个不同需要注意两点:如果我们将路径经过的点按顺序写下,比如当n=3时,若存在123和231。此时,我们认为这两条路径是同一条哈密顿回路。而123和213则是不同的哈密顿回路。若两个点之间有多条边,经过不同的边的路径仍然看作同一条哈密顿回路。不同哈密顿回路原创 2015-09-29 00:19:52 · 1620 阅读 · 0 评论 -
hiho一下 第六十四周
题意分析给定一个右键菜单的情况,每一个菜单内选项的数量,以及其子菜单的选项情况。合理的安排整个菜单展开的最大长度最小,输出这个最小值。算法分析题目中定义了菜单的元素:row: 表示一行选项section: 由至少一行row构成,其中row的顺序可以自由排列panel: 由至少一个section构成,其中section的顺序可以自由排列由于构成panel的元素是固定的,所以一个panel的长度原创 2015-09-29 00:26:38 · 1577 阅读 · 0 评论 -
hiho一下 第六十五周
题意分析给定一条单行道的高速公路,汽车都是从坐标0,向坐标无穷移动。又因为是单行道,所以后面的车无法超越前面的车。在时刻0时,有 N 辆车同时进入这条单行道,第i辆车从坐标x[i]进入,并且将会从坐标y[i]处驶出(保证y[i]>x[i])。在行驶过程中,汽车总会保持尽可能快的速度行驶,且第i辆车的最大速度为v[i]。问每辆车离开高速公路的所花费的时间。 算法分析刚拿到本题,相信最开始的想法都会是原创 2015-10-10 15:21:37 · 1638 阅读 · 0 评论 -
hiho一下 第六十六周
题意分析给定一幅字符表示的地图,其中包含有 1 个起点’H’,若干个座位’S’,墙壁’#’和行人’P’。其中墙壁’#’和行人’P’是不可通过的区域。假设在地图中,只能沿着上下左右移动,且每移动一个单元格为 1 步。询问从’H’点出发,是否能够到达两个相邻的’S’,且需要移动的步数最少是多少。 算法分析从题目当中,我们就可以知道本题需要做什么:读取字符地图,并找到起点的位置。从起点开始,遍历该地图,原创 2015-10-10 15:24:22 · 1621 阅读 · 0 评论 -
UVA - 11795 Mega Man's Mission
题意: 洛克人要打败n个robots, 并且每个robot都需要一些特定的武器才可以消灭, 现在给出洛克人的初始化武器和每个机器可以被消灭的特定武器. 问你有多少中消灭全部robots的顺序方式.解题思路: 1. 看了题目的数据量, n不大, 可以确定用二进制的状态表示. 算法的复杂度O(n*2^n); 2. 设dp[S]为已经消灭了S集合里面的robots的总方式. 状态方程: dp[S原创 2015-08-10 16:06:43 · 1712 阅读 · 0 评论 -
UVA - 11995 I Can Guess the Data Structure!
题目大意:给你一个移动方式,判断它是队列,栈,还是优先队列。解题思路:直接用STL里面的队列,栈,和优先队列去模拟,出现矛盾说明不是#include #include #include using namespace std;int main() { int n; while (scanf("%d", &n) != EOF) { stack st; que原创 2015-03-31 20:24:31 · 1676 阅读 · 0 评论 -
UVA - 11991 Easy Problem from Rujia Liu?
题目大意:给出一个包含n个整数的数组,你需要回答若干询问,每次询问两个整数k和v,输出从左到右第k个v的下标解题思路:用map映射一个vector,对应即为map即为一个可变长的数组,读取数组的时候将对应值放入即可。#include #include #include using namespace std;int main() { int n, m; while (sc原创 2015-04-01 20:00:47 · 1569 阅读 · 0 评论 -
1073 雷霆战机
Problem Description风风最近迷上了一个打飞机游戏——《雷霆战机》,战机分为白二星、绿三星、蓝四星、紫五星,四种品质。当然,最厉害的是紫色五星的战机啦。 战机分为升级和进阶两种。 升级:提升战机的等级,但战机品质不变。 进阶:可将战机提升一个星级(白二星->绿三星->蓝四星->紫五星)。为了简化问题,规定战机进阶规则如下: 白色二星: 起始等级Lv1级,满级Lv25级。原创 2015-05-09 14:55:09 · 2010 阅读 · 0 评论 -
1212 New Year Bonus Grant
Problem Description All programmers of Mocrosoft software company are organized in a strict subordination hierarchy. Every programmer has exactly one chief, except Bill Hates who is also the head of t原创 2015-05-09 15:06:36 · 1780 阅读 · 0 评论 -
1224 Robbers
Problem Description N robbers have robbed the bank. As the result of their crime they chanced to get M golden coins. Before the robbery the band has made an agreement that after the robbery i-th gangs原创 2015-05-09 15:10:45 · 1901 阅读 · 0 评论 -
1714 ACdream王国的花店
Problem Description ACdream王国的花店只有一家,所以大家想买花来装饰,店主为了防止有人恶意囤积鲜花来抬高物价(就是黄牛党啦~),于是就定下一个规矩:你买得越多,下一次买的单价就越贵!假设一个人已经购买了x朵鲜花,那么下一次购买第i朵鲜花的单价就是(x+1)*c[i],其中c[i]是一个店主为每一朵花的基本定价。 ACdream学校想开运动会,需要n朵鲜花来装饰,于是原创 2015-05-09 15:18:00 · 2179 阅读 · 0 评论 -
1715 ACdream王国的士兵
Problem Description 所谓弱国无外交,ACdream王国想守住这一片土地,自然离不开王国的士兵们,你作为王国的骠骑大将军,自然有训练王国士兵的职责。王国有n个士兵,每个士兵都有两个属性,攻击和防御。然后你希望经过一系列的调整,每个士兵都能成为合格的军人,所谓合格的军人,是指他的攻击和防御之和大于等于k。你的调整办法就是交换两个士兵的同一种属性,即把两个士兵的攻击交换,或者防御交换原创 2015-05-09 15:21:35 · 2024 阅读 · 0 评论 -
UVA - 10608 Friends
题目大意:给出 n 和 m,表示有 n 个人和 m 组关系,然后给出 m 行数据,每行数据含 a、b 表示 a 和 b 为一组的,问最后哪一组人数最多,输出最多的人数解题思路:可以说是一道裸的并查集,开一个 cnt 数组用于记录各组的人数,初始值为 1,然后每次合并两个组的时候 cnt 数组也要想加,最后输出最大的 cnt[i] 就可以了#include int A[30010]原创 2014-12-13 11:24:20 · 1684 阅读 · 0 评论 -
UVA - 10158 War
题目大意:有 n 个人,若干个命令,每个人分属于不同的国家,并且代表国家与其他代表会谈,这将决定国与国之间的同盟关系,1:a 与 b 结盟 2:a 与 b 决裂(成为敌人) 3:判断 a 与 b 是否为同盟(不包括不确定) 4:判断 a 与 b 是否为敌人。( 注意:同盟的同盟是同盟,敌人的敌人是朋友。添加新的关系时与已有的关系冲突的话输出-1 )解题思路:开一个 2 * n 的原创 2014-12-13 13:35:55 · 1616 阅读 · 0 评论 -
UVA - 10048 Audiophobia
题目大意:有n个城市,和m条街道,每条街道有一个噪音值,q次去问,从城市a到城市b,路径上分贝值的最大值最小为多少解题思路:Floyd变形#include #include using namespace std;int main() { int C, S, Q, cnt = 0, d[110][110]; while (scanf("%d%d%d", &C, &S,原创 2014-12-13 16:15:30 · 1669 阅读 · 0 评论 -
UVA - 567 Risk
题目大意:固定有 20 个点,然后输入 19 行的数据,每一行先输入一个n,表示该行还有 n 个数,然后输入 n 个数,表示每个数与该行的序号数相同的点有连接,并且权值为 1, 在数入 m,表示有 m 次询问,每个询问包含两个数值 a , b,输出 a~b 间的最短路径解题思路:Floyd算法#include #include int main() { int n, x,原创 2014-12-13 18:36:42 · 1703 阅读 · 0 评论 -
UVA 10110 Light, more light
#include #include int main() { long int n; while (scanf("%ld", &n), n) { if ( long(sqrt(n)) * long(sqrt(n)) == n) printf("yes\n"); else printf("no\n"); } return 0;}原创 2014-07-26 16:22:09 · 1610 阅读 · 0 评论 -
UVA 10061 How many zero's and how many digits ?
#include #include const int primes[150]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,21原创 2014-07-26 18:53:06 · 1640 阅读 · 0 评论 -
UVA - 571 Jugs
题意:有A, B两个容量的罐子,A B互质,可以对其执行一系列倒水操作,最终使B中剩下的水位n思路:1. 前提条件:如果A B互质,则 r = x*A mod B,对于x∈[0, B-1] r≠0. 这个很容易用最小公倍数证明之。2. 有了前提条件,则证明 r1 = x1*A mod B, r2 = x2*A mod B,对于x1, x2∈[0, B-1],x1≠x2 有r1≠原创 2015-03-07 15:21:26 · 1581 阅读 · 0 评论 -
UVA - 10056 What is the Probability ?
题目大意:有n个人玩丢骰子游戏,丢到某个点数为赢然后结束,从第1个人开始丢然后依次下去到n,重新从1开始,直到有人赢为止。 输入n个人,每个人丢到目标点数的概率p,第m个人。求第m个人赢的概率解题思路:我们直接求出第一个人第100轮赢的概率,然后推出第m个人赢的概率#include #include int main() { int T; scanf("%d",原创 2015-03-12 21:26:40 · 1629 阅读 · 0 评论 -
UVA - 10491 Cows and Cars
题目大意:给出a,b和c,表示有a + b 个门, a个后面是牛, b个后面是车, 然后你从中选一个门,之后有一个知情人帮你打开c个后面是牛的门(因为1≤c解题思路:问题可以分成两种情况:1)第一次选中牛的时候,a/(a + b), 然后打开c个后面是牛的门,总关门数为(a + b - c - 1),然后还有b个门后面是车,所以p1 = a * b / (a + b) / (a原创 2015-03-13 18:44:49 · 1493 阅读 · 0 评论 -
UVA - 10169 Urn-ball Probabilities!
题目大意:两个罐子,开始一个有一个红球,一个有一个红球一个白球,每次取一个球(放回),然后多放一个白球进去。给定n,求出取n次出现取得两个红球的概率。和取n次都是两个红球的概率的小数点后面的0有几位。解题思路:第一个问题:取n次出现取得两个红球的概率=1 - 取n次一次都没出现取得两个红球的概率第二个问题:每次都取到两红球概率不断叠乘上去 p[i] = p[i - 1] *原创 2015-03-13 22:05:50 · 1587 阅读 · 0 评论 -
UVA - 557 Burger
题目大意:给定2n个人,有n个汉堡和n个 奶酪汉堡,Ben and Bill排在最后,然后抛硬币,正反面分别拿汉堡和奶酪汉堡,如果有一样拿完了就不需要在扔硬币了。求最后ben和bill拿到一样的概率解题思路:这题直接算的话比较麻烦,因为不知道从第几个开始停止抛硬币。反过来算他们俩得到不同面包的概率比较简单。这样硬币就会从头抛到尾。所有的情况就是C(n/2 - 1, n - 2),就是把原创 2015-03-15 21:21:32 · 1838 阅读 · 0 评论 -
UVA - 11029 Leading and Trailing
题目大意:给出一个n和k求n^k的前三位数和后三位数。解题思路:后三为数可以用分治的方法(快速幂)去做,可是前三位数就比较麻烦了,看了别人的题解.n^k = 10 ^ (k * log10(n)),所以可以将多余的位数移到小数点后面然后舍弃掉,只保留前三位,pow(10, 2 + fmod(k * log10(n), 1)).#include#includeint pow原创 2015-03-17 20:44:46 · 1532 阅读 · 0 评论 -
UVA - 10023 Square root
题目大意:给出一个出,然后你求他的开方,这个数最大为10^1000。解题思路:用二分搜索找到他的开方import java.io.*;import java.math.*;import java.util.*;public class Main { public static void main(String []arg) { Scanner cin = ne原创 2015-03-17 20:46:32 · 1660 阅读 · 0 评论 -
UVA - 10308 Roads in the North
题目大意:给出一个无环无向图,求任意两点间的最大距离。输入空行问该组测试输入结束。解题思路:输入比较恶心,因为这个WA了一次,这题可以用dfs去做,任意选一个节点作为根节点,然后遍历与它相连的所有点,维护最大值就可以了,因为任意两点可以看成是以父亲节点而相连的。#include #include #include #include using namespace std原创 2015-03-17 20:58:21 · 1477 阅读 · 0 评论 -
UVA - 10717 Mint
题目大意:给出n和m,然后给出n种硬币的的厚度,现在在给出m个桌子的高度,要求对应每个桌子high,输出两个值,从n种硬币中选取4种,每一种硬币用若干个叠在一起,使得四个柱一样吧高h,先在要找出一个h小于等于high,一个h大于等于high,两个值都要尽量接近high。解题思路:枚举四种硬币,求出它们的最小公倍数。#include #include using namespac原创 2015-03-17 22:06:43 · 1506 阅读 · 0 评论 -
UVA - 10759 Dice Throwing
题目大意:给出n和x,计算在丢n个色子,出现的点数大于等于x的概率,要求分式最简。解题思路:num[i][j] 与num[i][j + 1]中间的增长个数与用i个色子丢出的点数为j的情况有关,然而求用i个色子丢出点数的情况则是非常好求的:num[i][j] = ∑(j + 1 ≤ k ≤ j + 6)num[i][k].然后就可以进一步的去求丢出i个色子丢出的点数小于x的情况。原创 2015-03-17 23:42:25 · 1506 阅读 · 0 评论 -
UVA - 138 Street Numbers
题目大意: 实际就是给你两个数m、n,使得m、n之间的数之和与1~m之间的数之和相等(不包括m)。即:1+2+...+m-1 == (m+1)+...+n; 因此我们可以套用求和公式,两边移项化简得:2*pow(m,2) = n*(n+1)。因此我们可以得到:n = sqrt(2*m*m)。枚举 m 的值,从而判断所得到的 n 值是否为整数,若为整数则说明两边的值实际相等。得到输出满足条件原创 2015-03-17 23:43:47 · 1567 阅读 · 0 评论 -
UVA - 10105 Polynomial Coefficients
题目大意:给出n和m,再该出m个数值n1 ~ nm, 保证n1 + ... + nm = n,现在有算式(a1 + a2 + ... + am) ^ n, 求展开项中a1^n1 + a2^n2 +...+ am^nm这项的系数。解题思路:(a + b)^n的系数为C(i, n), 那么对于算式(a1 + a2 + ... + am)^n可以理解成(X + am)^n,类似于递归的操作。原创 2015-03-17 23:52:26 · 1484 阅读 · 0 评论 -
UVA - 10375 Choose and divide
题目大意:给出p,q,s和r, 计算C(p, q) / C(s, r), 公式题目已经给出。解题思路:以为C(p,q) = C(p,p - q), 所以要尽量选择计算量交少的,边乘边除。#include #define min(a,b) (a)<(b)?(a):(b)int main() { int p, q, r, s; while (scanf("%d%d%d%d",原创 2015-03-17 23:57:34 · 1519 阅读 · 0 评论 -
UVA - 10006 Carmichael Numbers
题目大意:判断一个数是否为Carmichael数, (非素数, 并且满足a^n % n == a, a 的取值为2 ~ n - 1)。解题思路:Eratosthenes筛选法求出素数,然后对应n如果为非素数,就对每个a进行判断,中间用到快速幂。#include #include const int N = 65005;int prime[N] = {0}, M = sqrt(原创 2015-03-17 23:59:48 · 1466 阅读 · 0 评论 -
UVA - 128 Software CRC
题目大意:给出一个字符串,表示一个256进制的数(因为char类型表示的字符范围),现在要再这个256进制的数后面加两位数值,使得新的数可以被十进制数g = 34943整除,输出添加两位数的16进制。解题思路:在原先的数的基础上加两位,比如加的两位数为x, 原先的数为y,那么新组成的数就为(y * 256 * 256 + x),而这个数要被g整除。所以我的做法是将num(256进制数)原创 2015-03-18 00:02:05 · 1519 阅读 · 0 评论