
算法竞赛入门经典(第二版)
文章平均质量分 76
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
习题6-11 树重建 UVa10410
1.题目描述:点击打开链接2.解题思路:由于只给定了BFS,DFS序列,当然要通过先序遍历(即DFS)和层次遍历(即BFS)将原树构造出来。先序遍历时利用BFS数组找出正在访问的结点的子结点,层次遍历时利用DFS数组找到本层结点的结束位置(即下一层的起始结点),由于细节比较多,详细过程请参见程序的注释3.代码:#define _CRT_SECURE_NO_WARNINGS#inc原创 2015-01-31 19:58:05 · 703 阅读 · 0 评论 -
习题5-5 复合词 UVa10391
1.题目描述:点击打开链接原创 2014-08-13 11:43:02 · 960 阅读 · 0 评论 -
习题5-3 卡片游戏 UVa10935
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;queuecard;int n;int main()原创 2014-08-12 11:52:08 · 840 阅读 · 0 评论 -
习题3-10 盒子 UVa1587
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeint a[6][2];int mark[6];int main(){ while (scanf("%d%d", &a[0][0], &a[0][1]) == 2) { for (int i = 1; i < 6; i++) scanf("%原创 2014-07-13 11:38:24 · 1444 阅读 · 3 评论 -
习题 3-4 周期串 UVa455
#include#include#include#define max 100+10char s[max];int main(){ int n, len; scanf("%d", &n); getchar(); while (n--) { getchar(); gets(s); len = strlen(s); for (int i = 1; i <= len原创 2014-06-20 17:33:22 · 5637 阅读 · 7 评论 -
习题3-3 数数字 UVa1225
#include#include#include#define max 40000+10char s[max];int main(){ int T; scanf("%d", &T); while (T--) { int n; int first = 1; scanf("%d", &n); char*p = s; for (int i = 1; i <= n;原创 2014-06-20 17:28:55 · 1105 阅读 · 0 评论 -
习题6-3 二叉树重建 UVa536
1.题目描述:点击打开链接2.解题思路:一开始的原创 2014-08-29 15:37:42 · 781 阅读 · 0 评论 -
习题6-2 S树 UVa712
1.题目描述:点击打开链接2.解题思路:原创 2014-08-29 11:53:43 · 732 阅读 · 0 评论 -
习题4-8 特别困的学生 UVa12108
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#define N 1000000int n;int a[15], b[15], c[15];int main(){ int rnd = 0; while (scanf("%d",&n),n) { for (int i = 0原创 2014-08-06 21:35:18 · 3092 阅读 · 5 评论 -
例题8-10 抄书 UVa714
1.题目描述:点击打开链接2.解题思路:本题要求“最大值最小”,这是一种很常见的优化目标。不妨考虑这个问题:能否把输入的序列划分为k个连续子列,使得所有的S(i)均不超过k?若定义一个谓词P(x),则让P(x)为真时x最小就是答案。那么如何求P(x)呢?根据题意可以选择如下贪心策略:从后往前扫描,每次都尽可能多的向左分,如果分不下去了,标记此时的位置。这样在O(N)时间内就能计算出P(x)的结原创 2015-02-06 16:57:47 · 649 阅读 · 0 评论 -
习题6-4 骑士的移动 UVa439
1.题目描述:点击打开链接2.解题思路:典型的BFS,原创 2014-08-29 17:32:35 · 649 阅读 · 0 评论 -
习题5-2 Ducci序列 UVa1594
1.题目描述:点击打开链接2.解题思路:模拟题意原创 2014-08-12 16:31:31 · 960 阅读 · 0 评论 -
习题5-4 交换学生 UVa10763
其实我的思路想复杂了,AC了之后看了别人的代码才发现如此简单原创 2014-08-12 14:24:51 · 766 阅读 · 0 评论 -
习题4-4 骰子涂色 UVa253
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#define max 20char a[max];int tp[10];int b[10];int c[10];int less(int p, int q){ int len = 4; for (int i = 0; i < l原创 2014-08-06 12:28:30 · 1184 阅读 · 5 评论 -
习题4-2 正方形 UVa201
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#define max 200int n, m;int arr[max][3];int find(int len, int a, int x, int y){ if (a == 'V') return 0; int aa = 1, b原创 2014-07-31 00:17:37 · 1131 阅读 · 1 评论 -
习题3-2 分子量 UVa1586
#include#include#include#define max 100char s[max];int main(){ int T; scanf("%d", &T); while (T--) { double sum = 0; scanf("%s", s); double arr[] = { 12.01, 1.008, 16.00, 14.01 }; in原创 2014-06-20 17:27:29 · 3275 阅读 · 4 评论 -
习题3-9 子序列 UVa10340
#include#include#include#include#define max 100000char s[max], t[max];int main(){ //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); while (scanf("%s%s", s, t) != EOF原创 2014-06-26 14:43:31 · 733 阅读 · 0 评论 -
例题8-5 Gergovia的酒交易 UVa11054
1.题目描述:点击打开链接2.解题思路:考虑最左边的村庄,假设需要买酒,即a1>0,则一定有劳动力从第二个村庄往左给村庄1送酒,而不必考虑酒是从哪里来的。这样,问题就转化成只有村庄2~n,且第2个村庄的需求为a1+a2的情况。这样的推理对a13.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include原创 2015-02-06 12:46:00 · 736 阅读 · 0 评论 -
例题7-7 天平难题 UVa1354
1.题目描述:点击打开链接2.解题思路:利用二进制原创 2014-09-08 23:36:43 · 3128 阅读 · 9 评论 -
习题6-1 平衡的括号 UVa673
1.题目描述:点击打开链接2.解题思路:利用栈分类进行原创 2014-08-29 10:56:20 · 736 阅读 · 0 评论 -
习题5-8 图书管理系统 UVa230
1.题目描述:2.解题思路原创 2014-08-14 18:51:22 · 968 阅读 · 0 评论 -
习题5-6 对称轴 UVa1595
1.题目描述:2.解题思路:判断是否对称只需要看x坐标,因此可以先将原创 2014-08-13 15:02:19 · 830 阅读 · 0 评论 -
习题4-1 象棋 UVa1589
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#define max 10#define rise(i,a,b) for(int i = a + 1;i <= b;i++)#define fall(i,a,b) for(int i = a - 1;i >= b; i--) int原创 2014-07-28 09:14:14 · 1446 阅读 · 2 评论 -
习题3-8 循环小数 UVa202
#include#include#include#include#define max 7000int arr[max];int main(){ //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int a, b; while (scanf("%d %d", &a, &b)原创 2014-06-25 22:53:19 · 1233 阅读 · 3 评论 -
习题2-6 排列
#include#includeint main(){ int a, b, c, d, e, f, g, h, i; for (int p = 123; p <= 329; p++) { int n = p; a = n / 100; b = n / 10 % 10; c = n % 10; n *= 2; d = n / 100; e = n / 10 %原创 2014-06-20 17:30:47 · 725 阅读 · 0 评论 -
例题8-1 煎饼 UVa120
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决,按照题意,可以先复制原队列,并排好序,从大到小以此把每个数排到正确位置,方法是:先翻到上面,再翻到正确位置,每翻一次,都要判断队列是否已经排好,如果本来就在最顶层,或局部和排过序的队列相同,可以跳过,无需翻转3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include原创 2015-02-04 22:50:00 · 1119 阅读 · 0 评论 -
例题8-12 奇怪的气球膨胀 UVa12627
1.题目描述:点击打开链接2.解题思路:本题相当于一道数学题:看图找规律。通过观察可以发现第k(k>1)小时的图相当于第k-1时候的三个图拼接起来再加上全部是蓝球的图,因此可以通过寻找递推关系加以解决。假设函数f(k,i)表示第k小时,前i行的所有红球个数,则问题的答案就是f(k,B)-f(k,A-1)。f(k,i)的求解需要根据i与2的(k-1)次方的大小分类讨论,递归求解。3.代码:原创 2015-02-06 20:32:27 · 1325 阅读 · 0 评论 -
习题8-1 装箱 UVa1149
1.题目描述:点击打开链接2.解题思路:本题是贪心法的经典例题,贪心策略是:最短的和最长的匹配,次短的和次长的匹配,以此类推。如果不能匹配,则等待。注意要先排序。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include#include#in原创 2015-02-08 11:14:11 · 696 阅读 · 0 评论 -
例题8-13 环形跑道 UVa11093
1.题目描述:点击打开链接2.解题思路:本题属于简单模拟题,只需要从第一个加油站开始模拟,如果有解,直接输出;否则假设走到加油站p(p>0)时走不下去了,那么可以证明2,3…p都不是解(因为从1到其中任何一个点时油量≥0,情况不比直接从这一点出发坏)因此下一次可以直接从p+1开始模拟。注意每次重新模拟时gas要置零(我在这个地方被坑得好惨==)3.代码:#define _CRT_SEC原创 2015-02-07 14:06:10 · 766 阅读 · 0 评论 -
习题8-2 聚会游戏 UVa1610
1.题目描述:点击打开链接2.解题思路:这道题把我坑的快死。。。由于紫书上注释了一句话:”本题看似简单,实际暗藏陷阱,需要考虑细致,周全“,我开始还不以为然,经过了若干次WA的血的教训才让我发现,这道题的细节还真是多的令我头疼:需要分好多情况:两个串的位置i后面都有字母时,枚举到某个串的最后一个位置时,还要注意如果是字母‘Z’的这个最隐蔽的特殊情况。。。到了最后对拍都找不出任何能够hack我程原创 2015-02-08 17:08:31 · 702 阅读 · 0 评论 -
习题9-2 免费糖果 UVa10118
1.题目描述:点击打开链接2.解题思路:本题虽然是动态规划专题的习题,但更像是一道用回溯法解决的问题。定义d(a,b,c,d)表示分别从每堆拿走a,b,c,d个糖果时的最大配对数目。每次都枚举从四个糖果堆拿糖的情况,并用hash数组来判断篮子中糖果的奇偶性。刚刚有一个时是false变为true,恰好配对是true变为false。3.代码:#define _CRT_SECURE_NO_W原创 2015-02-15 23:59:50 · 787 阅读 · 0 评论 -
例题9-13 Hali-Bula的晚会 UVa1220
1.题目描述:点击打开链接2.解题思路:本题几乎就是树的最大独立集问题,只不过多了一个判断解的唯一性的要求。针对这种情况,可以做如下定义:(1)d(u,0),f(u,0)分别表示以u为根的子树中,不选u点的最大人数和方案的唯一性(f=1表示唯一,f=0表示不唯一);(2)d(u,1),f(u,1)分别表示以u为根的子树中,选u点的最大人数和方案的唯一性(f=1表示唯一,f=0表示不唯一原创 2015-02-15 12:28:39 · 1001 阅读 · 0 评论 -
例题9-2 巴比伦塔 UVa437
1.题目描述:点击打开链接2.解题思路:本题利用动态规划解决,由于影响决策的因素是顶面的尺寸,因此可以用二元组(a,b)表示“顶面尺寸为a,b这个状态”,由于每次都要求增加一个立方体后顶面的长和宽都会严格减小,因此这个图是一个DAG,可以利用DAG上的最长路算法解决。不过这里会遇到一个问题,由于a,b可能很大,不能直接用d(a,b)表示状态。此时可以利用间接表示法:用(idx,k)表示(a,b原创 2015-02-11 15:53:21 · 1531 阅读 · 0 评论 -
例题9-3 旅行 UVa1347
1.题目描述:点击打开链接2.解题思路:本题看似一道几何问题,实际上可以利用动态规划解决。走一圈周长最短可以等价为两个人同时从最左端出发,沿着不同的路径走到最右端。如果定义d(i,j)表示1~max(i,j)全部走过,第一个人在i,第二个人在j,还需要走多长的距离。此时可以规定i>j,这样,还可以规定i,j中只有一个人允许走到i+1这一点。这样的话可以保证不会出现某些点跳过的情况。状态转移方程原创 2015-02-11 17:59:22 · 2918 阅读 · 1 评论 -
例题9-15 校长的烦恼 UVa10817
1.题目描述:点击打开链接2.解题思路:本题利用集合上的动态规划解决。定义集合s1表示恰好有一个人教的课程,集合s2表示至少有两个人教的课程。定义d(i,s1,s2)表示已经考虑了前i个人时的最小花费(人物编号从0开始)。则不难写出状态转移方程:d(i,s1,s2)=min{d(i+1,s1',s2')+c[i],d(i+1,s1,s2)};上式中只有当i≥m时才会考虑第二项。对于这个原创 2015-02-16 15:00:01 · 971 阅读 · 0 评论 -
例题10-2 不爽的裁判 UVa12169
1.题目描述:点击打开链接2.解题思路:本题要求找到合适的一组a,b,使得按照递推公式能输出正确的x2,x4...可以枚举a值,通过列写方程得到b的值,但这里有一个问题,这里是一个同余方程,等号的一端带有k*10001,这时就应该迅速的想到利用扩展gcd来解决,已知量为1001,a+1,求出gcd(10001,a+1)以及线性方程的系数x,y即可。当发现计算出的数和原来的输入矛盾时,说明a是非原创 2015-02-20 12:31:35 · 1243 阅读 · 0 评论 -
习题8-10 奇怪的股市 UVa1614
1.题目描述:点击打开链接2.解题思路:本题其实等价于找一些数,使得他们的和等于sum/2,猛一看不知道如何下手,其实很简单:从后往前一个个试即可,如果相加后大于sum/2,必然不是这一组的数,由于必然有解,因此这样做最后一定能找到解。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#i原创 2015-02-09 18:49:19 · 745 阅读 · 0 评论 -
习题8-13 外星人聚会 UVa10570
1.题目描述:点击打开链接2.解题思路:本题利用暴力搜索,逐个枚举排列的起始位置,然后分顺时针,逆时针两种情况将杂乱的排列变成有序的环状排列。比如需要将1 2 4 3变成从位置2(范围是0~n-1)开始的顺时针排列(即把它变成3 4 1 2,数字1从位置2开始),那么如果1在原来的排列中不在指定的位置2,就需要将原排列中的数字1和位于位置2的数字交换位置,强制数字1调整到位置2,以此类推,有点原创 2015-02-10 14:21:37 · 586 阅读 · 0 评论 -
习题8-4 奖品的价值 UVa11491
1.题目描述:点击打开链接2.解题思路:本题利用贪心法,最好边输入边处理,由于需要删除d个数字,即保留n-d个数字。假设变量i来扫描输入的第i个数字(从0开始),那么待填写的数字还有n-i个。令变量k表示第k个已经填写的数字,只有当kn-d,即已填写的数字加上等待填写的所有数字大于要保留的数字个数时,需要替换已经填写的数字,此处的贪心策略是:设当前输入的数是c,那么k向前寻找恰好大于c的那个数原创 2015-02-09 15:22:54 · 1945 阅读 · 2 评论 -
例题10-5 GCD等于XOR UVa12716
1.题目描述:点击打开链接2.解题思路:本题能用的判断条件只有两个:(1)gcd(a,b)=c;(2)(a^b)=c;通过观察容易发现如果gcd(a,b)=(a^b)=c,那么c=a-b,因此可以事先枚举所有a的因数c,利用b=a-c计算b,然后只需验证是否满足(a^b)==c即可。但本题的数据太大,而且枚举约数不容易,因此可以利用约数c枚举倍数a,这样就会方便很多,打表的效率也足够高;而且,原创 2015-02-20 22:46:10 · 836 阅读 · 0 评论