![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
挑战程序设计竞赛
文章平均质量分 89
梁山伯liangrx06
热爱学习研究算法
展开
-
《挑战程序设计竞赛》2.5.1 最短路 AOJ0189 2249 2200 POJ3255 2139 3259 3268(5)
POJ2139http://poj.org/problem?id=2139题意奶牛们最近要拍电影了…… 1、若两个的奶牛一起工作则,他们相互的度(degrees)为; 2、若两只奶牛a、b不一起工作,但与另有一只奶牛都和他们工作,则a、b的相互的度为2。 求奶牛的与其他奶牛的度的平均值的100的整数。思路本题题意可以变换的理解为如果N个点在一个集合中,则这些点之间的距离为1。然后由此建立一个无原创 2015-12-30 23:57:33 · 1084 阅读 · 4 评论 -
《挑战程序设计竞赛》3.2.1 常用技巧-尺取法 POJ3061 3320 2566 2739 2100(1)
POJ3061http://poj.org/problem?id=3061题意给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数。思路如果两两相减再排序复杂度太高,肯定超时了,二分法求解复杂度将大大降低。 枚举最中间的那个数,然后判断一下相减得到的数有多少个大于等于枚举的数。 如何判断上面所说的那句呢,其实不用把每个数相减,只需要排序一下,然后将当前这个数 +原创 2015-12-31 22:58:19 · 712 阅读 · 0 评论 -
《挑战程序设计竞赛》3.1.4 二分搜索-最小化第k大的值 POJ2010 3662(2)
POJ2010http://poj.org/problem?id=2010题意给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数。思路如果两两相减再排序复杂度太高,肯定超时了,二分法求解复杂度将大大降低。 枚举最中间的那个数,然后判断一下相减得到的数有多少个大于等于枚举的数。 如何判断上面所说的那句呢,其实不用把每个数相减,只需要排序一下,然后将当前这个数 +原创 2015-12-31 22:54:12 · 805 阅读 · 0 评论 -
《挑战程序设计竞赛》3.1.3 二分搜索-查找第k大的值 POJ3579 3685
POJ3579http://poj.org/problem?id=3579题意给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数。思路如果两两相减再排序复杂度太高,肯定超时了,二分法求解复杂度将大大降低。 枚举最中间的那个数,然后判断一下相减得到的数有多少个大于等于枚举的数。 如何判断上面所说的那句呢,其实不用把每个数相减,只需要排序一下,然后将当前这个数 +原创 2015-12-31 22:50:51 · 624 阅读 · 0 评论 -
《挑战程序设计竞赛》3.1.1 二分搜索-最大化最小值 POJ1064 2456 3258 3273 3104 3045
POJ1064http://poj.org/problem?id=1064题意给出n条线段,以米的单位给出,小数点后两位(精确到厘米),要你对这些线段裁剪,裁剪出m条等长的线段,并且让这些线段尽可能长另外线段的长度不能小于1厘米,如果筹不够m条,输出0.00。思路很明显的用二分法求解题目,二分法的的试验值实际上为题目增加了一个条件,加上这个条件判断是否符合题目要求即可。 但需要注意答案的精度会对判原创 2015-12-31 20:47:45 · 1097 阅读 · 1 评论 -
《挑战程序设计竞赛》3.1.2 二分搜索-最大化平均值 POJ2976 3111
POJ2976http://poj.org/problem?id=2976题意给出n个对,可以从中最多排除k个对,求∑a/∑b的最大值。思路二分法求解,书中例题跟这个题其实是一样的。 这个题对精度的要求其实并不像题目介绍中说的那么低,程序中应该写的更高一些才行。题目说0.001,实际上至少要0.0001.代码Source CodeProblem: 2976 User: liangrx0原创 2015-12-31 22:36:14 · 535 阅读 · 0 评论 -
《挑战程序设计竞赛》2.6.3 数学问题-快速幂运算 POJ1995
POJ1995http://poj.org/problem?id=1995题意求(A1^B1+A2^B2+ … +AH^BH)mod M.思路标准快速幂运算题目,算法复杂度为logN。不需要解释,直接看代码好了。代码Source CodeProblem: 1995 User: liangrx06Memory: 204K Time: 329MSLanguage: C++原创 2015-12-31 00:04:32 · 568 阅读 · 0 评论 -
《挑战程序设计竞赛》4.2.1 游戏必胜策略-推理与动态规划算法 POJ2484 2348 1082 2068 3688 1740(1)
POJ 2484 取硬币游戏http://poj.org/problem?id=2484题意给出N个硬币围成一个圈,然后两个人从这圈硬币中轮流拿1个或毗邻的2个硬币。直到全部拿完为止,最后一个拿的人为,胜者。思路当n==1 || n==2时,明显先手必胜。 当n==3时,明显先手必败。 由于每次只可取1或2个,而取2个时,2个必须相邻,推断有: 当n>3时,若n为偶数,先手无论如何取,后手可在原创 2016-01-18 15:12:30 · 941 阅读 · 0 评论 -
《挑战程序设计竞赛》4.2.2 游戏必胜策略-Nim与Grundy数 POJ2975 1704 2311 3537 2315 CF138D(2)
POJ 2975 取石头问题http://poj.org/problem?id=2975题意有n堆石头,甲乙两个人轮流拿,每次从某堆石头中拿出至少一个。若轮到某人时无石可拿,此人输。 当甲存在必赢策略时,并不意味着他从任意一堆里选石头都能赢。求他有多少种拿石头的方案可以使乙达到必输态(也就是甲必赢)。思路判断输赢根据下式: X=a[0]^a[1]^……a[n] 当X为0则必输,大于0则必赢。原创 2016-01-18 15:48:49 · 1162 阅读 · 0 评论 -
《挑战程序设计竞赛》2.6.2 数学问题-素数 AOJ0009 POJ3126 3421 3292 3641
AOJ0009http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0009题意求不大于n的素数个数。思路素数筛法可解,筛法过程中可顺便统计不大于n的素数个数。 另外这个题由于有多个测试数据,可预先求出题目所给数据范围的所有解。 素数筛法中我的写法里要注意数的范围,这个题中的i*i是可能超过int表示范围的,因而我提交了好几次都是RE,原创 2015-12-31 00:02:49 · 1151 阅读 · 0 评论 -
《挑战程序设计竞赛》3.2.3 常用技巧-弹性碰撞 POJ3684 2674
#POJ2785[http://poj.org/problem?id=2785](http://poj.org/problem?id=2785)##题意将N个半径为R的球放入一个圆桶(圆桶口径刚好放入一个球),将圆桶竖直放着,最下端距离地面H高度,让球每隔一秒自由下落,求T时刻各个球距离地面的高度。原创 2016-01-01 14:45:46 · 756 阅读 · 1 评论 -
《挑战程序设计竞赛》3.2.2 常用技巧-反转 POJ3276 3279 3185 1222
POJ3276http://poj.org/problem?id=3276题意N头牛排成一列1<=N<=5000。每头牛或者向前(表示为F)或者向后(表示为B)。为了让所有牛都面向前方,农夫每次可以将K头连续的牛转向1<=K<=N,求操作的最少次数M和对应的最小K。思路所有情况穷举O(2^N)肯定超时。 顺序考虑每头牛的反转方向能不能行呢?因为想改变一头牛的方向就必定影响k头牛,但再思考一下,当一原创 2016-01-01 14:44:09 · 1456 阅读 · 1 评论 -
《挑战程序设计竞赛》3.3.2 数据结构-线段树和平方分割 POJ2991 3264 2104 3468 3368 3470 1201 UVA11990(4)
# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.co原创 2016-01-06 22:21:09 · 1200 阅读 · 0 评论 -
《挑战程序设计竞赛》2.4.1 数据结构-优先队列 POJ2431 3253 3614 2010(3)
POJ3253http://poj.org/problem?id=3253题意有一块长木板,要经过n-1次切割将其切成n块FJ想要的木板,对于每块木板,没切割一次,将会消耗和这条木板长度值相等的金钱,问最少需要多少钱,可将木板切成自己想要的n块。思路这个题前面用贪心法已经解过了,贪心法朴素实现时间复杂度是O(N2)。 而如果用优先队列实现,复杂度将是O(N)次O(logN)。代码Source Co原创 2015-12-30 23:55:52 · 614 阅读 · 0 评论 -
《挑战程序设计竞赛》3.2.4 常用技巧-折半枚举 POJ2785 3977 2549
POJ2785http://poj.org/problem?id=2785题意输入n,表示a b c d 四个集合都有n个元素。之后每行输入4个集合中的一个元素。求这四个集合每个集合中拿出一个数相加等于0的组数。思路如果直接搜,复杂度为O(N^3),时间不满足要求。 折半搜索比较适合,把4个数字分成两份,分别两两求和,得到两个长度n*n的一维数组,排序后比较进行匹配即可。 另外这个题还可以用ha原创 2016-01-01 14:47:22 · 906 阅读 · 0 评论 -
《挑战程序设计竞赛》3.2.5 常用技巧-坐标离散化 AOJ0531(1RE)
AOJ3061http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0531题意涂色:为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌。三合板上不需要涂色的部分预先贴好了护板。被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色。 请编写一个程序计算涂色数量,输入数据中,保证看板不会被护板全部遮住,并且护板的边一定是水平或垂原创 2016-01-01 14:48:09 · 1357 阅读 · 0 评论 -
《挑战程序设计竞赛》3.4.1 动态规划-状态压缩DP POJ3311 2686 2411 2441 3254 2836 1795 3411(2)
POJ3311 旅行商问题http://ac.jobdu.com/problem.php?pid=3311题意给一个起点和终点相同的图,一个矩阵表示各个点之间的距离,求经过所有的点,回到原点的最下路径,点可以重复走。思路这个题基本等同于书中例题,唯一的区别是点可以重复走(其实这样对于书中的解法来说,更简单了)。 书中的DP解法是:将已经访问过的节点集合(起点0不算)记为S,当前所在的顶点为v,用d原创 2016-01-06 22:22:41 · 1306 阅读 · 0 评论 -
《挑战程序设计竞赛》3.4.2 动态规划-矩阵幂 POJ3070 3734 3233 2663 3420 3735
POJ3070http://ac.jobdu.com/problem.php?pid=3070题意求斐波那契数列第n项的值对10^4取余的结果。思路由于n很大,常见的数组递推肯定是不行的。要用矩阵幂来做,时间复杂度O(logN)。这里不再讲解,书中以及题目中都有讲解或提示。代码Source CodeProblem: 3070 User: liangrx06Memory: 176K原创 2016-01-06 22:33:33 · 733 阅读 · 0 评论 -
《挑战程序设计竞赛》1.6 轻松热身 POJ1852
AntsTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 12782 Accepted: 5596DescriptionAn army of ants walk on a horizontal pole of length l cm, each with原创 2015-12-08 23:42:37 · 325 阅读 · 0 评论 -
《挑战程序设计竞赛》3.1.5 二分搜索-其它 POJ1759 3484
POJ1759http://poj.org/problem?id=1759题意给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数。思路如果两两相减再排序复杂度太高,肯定超时了,二分法求解复杂度将大大降低。 枚举最中间的那个数,然后判断一下相减得到的数有多少个大于等于枚举的数。 如何判断上面所说的那句呢,其实不用把每个数相减,只需要排序一下,然后将当前这个数 +原创 2015-12-31 22:55:51 · 476 阅读 · 0 评论 -
《挑战程序设计竞赛》3.3.1 数据结构-树状数组 POJ3468 1804 1990 3109 2155 2886(4)
# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.com/problem.php?pid=题意思路代码# http://ac.jobdu.co原创 2016-01-06 22:19:15 · 969 阅读 · 0 评论 -
《挑战程序设计竞赛》2.6.1 数学问题-辗转相除法 AOJ0005 POJ2429 1930(1)
AOJ0005http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0005题意给定两个数,求其最大公约数GCD以及最小公倍数LCM。思路求最大公约数一般用辗转相除法,然后就得到了最小公倍数。 更详细的分析参见我的博客文章: 数论——最大公约数和最小公倍数算法代码#include <iostream>#include <cstdio>原创 2015-12-30 23:58:38 · 581 阅读 · 0 评论 -
《挑战程序设计竞赛(第2版)》编程报告
刷过九度OJ上大部分题之后,对编程算法的理解确实要提高了一些,但掌握的知识还不是很系统。恰好在网上看到《挑战程序设计竞赛》这本书,我想这本书确实适合编程爱好者进行系统的学习。这本书由浅入深对编程思想进行系统讲解,提供的源代码可以帮助规范编程格式,再者提供的题目列表让刷题更加系统。从即日起,笔者会将本书中列出的题目在相关OJ上练习,主要包括三个:POJ、AOJ和GCJ。并将自己的解答思路以及代码原创 2015-12-08 23:32:09 · 579 阅读 · 0 评论 -
《挑战程序设计竞赛》2.3.3 动态规划-进阶 POJ1065 1631 3666 2392 2184
POJ1065http://poj.org/problem?id=1065题意描述C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?输入第一行是一个整数T,表示原创 2015-12-29 13:57:26 · 879 阅读 · 4 评论 -
《挑战程序设计竞赛》2.5.2 最小生成树 POJ3723 3169 1258 2377 2395 AOJ2224(1)
POJ3723POJ3169POJ1258http://poj.org/problem?id=1258题意有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离。思路求最小生成树,由于这个题直接给出了邻接矩阵,所以用prim算法比较合适。代码Source CodeProblem: 1258原创 2015-12-30 23:58:00 · 939 阅读 · 0 评论 -
《挑战程序设计竞赛》2.4.2 数据结构-并查集 POJ1182 2236 1703 AOJ2170
POJ1182http://poj.org/problem?id=1182题目难得的中文题。。。 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 56252 Accepted: 16485 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,原创 2015-12-30 23:56:41 · 1427 阅读 · 1 评论 -
《挑战程序设计竞赛》2.3.2 动态规划-优化递推 POJ1742 3046 3181
POJ1742http://poj.org/problem?id=1742题意有n种面额的硬币,面额个数分别为Ai、Ci,求最多能搭配出几种不超过m的金额?思路据说这是传说中的男人8题呢,对时间和空间复杂度要求都挺高的。 朴素DP三重循环比较容易想到,但显而易见会TLE。 这里由于dp数组记录的是一个bool值(是否能搭配出某金额),记录的信息较少,因而存在浪费。优化思路是dp[i][j]记录用原创 2015-12-27 22:22:55 · 621 阅读 · 0 评论 -
《挑战程序设计竞赛》2.3.1 动态规划-基础 POJ3176 2229 2385 3616 3280
POJ3176Cow Bowling题意输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。思路最显而易见的是使用二维数组动态规划计算。 比如dp[i][j]表示以第i行j列的位置作为终点的路线的最大权值。 (注意区分初始化时的意义) 那么dp[i][j]的最大值取决于dp[i-1原创 2015-12-19 16:04:25 · 508 阅读 · 0 评论 -
《挑战程序设计竞赛》2.2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262
POJ3617Best Cow Line题意给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 目标是构造字典序尽可能小的字符串T。思路贪心算法,不断取S的开头和末尾中较小的一个字符放到T的末尾。但对于S的开头和末尾字符相同的情况下,需要比较下一个字符大小,这可以用如下算法实现: 按照字典序比较S原创 2015-12-18 15:07:38 · 665 阅读 · 0 评论 -
《挑战程序设计竞赛》2.2.1 贪心法-区间 POJ2376 POJ1328 POJ3190
Best Cow LineTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14869 Accepted: 4226DescriptionFJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annu原创 2015-12-15 10:31:26 · 652 阅读 · 0 评论 -
《挑战程序设计竞赛》2.1.3 穷竭搜索 POJ2718 POJ3187 POJ3050 AOJ0525
Smallest DifferenceTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6509 Accepted: 1773DescriptionGiven a number of distinct decimal digits, you can fo原创 2015-12-13 19:44:52 · 478 阅读 · 0 评论 -
《挑战程序设计竞赛》2.1.2 广度优先搜索 AOJ0558 POJ3669 AOJ0121
原题目链接如下:AOJ0558中文解释:在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。 老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能原创 2015-12-11 16:45:40 · 1095 阅读 · 0 评论 -
《挑战程序设计竞赛》2.1.1 深度优先搜索 POJ2386 POJ1979 AOJ0118 AOJ0033 POJ3009
Lake CountingTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 25366 Accepted: 12778DescriptionDue to recent rains, water has pooled in various places i原创 2015-12-08 23:54:21 · 1529 阅读 · 0 评论