![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛入门经典训练指南-第二章
文章平均质量分 70
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
UVA 11806 - Cheerleaders(数论+容斥原理)
题目链接:11806 - Cheerleaders题意:在一个棋盘上,要求四周的四行必须有旗子,问有几种摆法。思路:直接算很容易乱掉,利用容斥原理,可知AUBUCUD = |A| + |B| + |C| + |D| - |AB| - |BC| - |AC| - |AD| - |BD| - |CD| + |ABC| + |ABD| + |ACD| + |BCD| - |ABCD|由此利用原创 2014-04-29 23:33:06 · 1138 阅读 · 0 评论 -
UVA 10367 - Equations(数论+模拟)
题目链接:10367 - Equations题意:题意很简单,给定两个二元一次方程,求x,y,如果矛盾或者求不出来就输出dont know思路:模拟。。。恶心题。。很多细节要注意代码:#include #include #include #define INF 0x3f3f3f3fint t;char str[1005];struct Exp { l原创 2014-04-13 19:36:21 · 810 阅读 · 0 评论 -
UVA 617 - Nonstop Travel(数论+暴力枚举)
题目链接:617 - Nonstop Travel题意:给定一些红绿灯,现在速度能在30-60km/h之内,求多少个速度满足一路不遇到红灯。思路:暴力每一个速度,去判断可不可以,最后注意下输出格式即可代码:#include #include #include const double esp = 1e-6;int n, vis[105];struct D { do原创 2014-04-28 12:48:20 · 1167 阅读 · 0 评论 -
UVA 1529 - Clock(数论)
题目链接:1529 - Clock题意:给定两个时刻,求时针和分针相遇次数。思路:先把转一圈会相遇的时刻记录下来,这些时刻肯定是固定的,然后由给定的两个时刻a,b,求出12点到a相遇次数c1,12点到b相遇次数c2,ans = c2 - c1代码:#include #include const double esp = 1e-6;int h1, m1, h2, m2;do原创 2014-04-27 11:31:05 · 1184 阅读 · 0 评论 -
UVA 11401 - Triangle Counting(数论+计数问题)
题目链接:11401 - Triangle Counting题意:有1,2,3....n的边,求最多能组成的三角形个数。思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2;然后扣除掉重原创 2014-04-29 22:57:42 · 1730 阅读 · 0 评论 -
UVA 10995 - Educational Journey(数论)
题意:10995 - Educational Journey题意:给定A遇到C,M,D的时刻和D遇到C,M的时刻,求C遇到M的时刻思路:先把时间都处理成秒,然后从A遇到C后,从该点出发,A遇到D和C遇到D,就能求出速度Va和Vc之间的关系,由A遇到M后,从该点出发,A遇到D和M遇到D可以推出Va和Vm的关系,从而推出Vc和Vm的关系,然后由C和M遇到点出发,C遇到D和M遇到D的时间可以算,原创 2014-04-27 11:22:39 · 1088 阅读 · 0 评论 -
UVA 10773 Back to Intermediate Math(数论)
题目链接:Back to Intermediate Math题意:两种过河方式,一种笔直过河,一种最快过河,求两种时间差只要计算出两种时间,笔直过河的速度等于两个速度分量的合速度,最快就等于船速度,求出差即可。代码:#include #include #include int t, d, v, u;int main() { int cas = 0; scanf(原创 2014-04-27 11:16:33 · 1348 阅读 · 0 评论 -
UVA 11538 - Chess Queen(数论+计数问题)
题目链接:11538 - Chess Queen题意:给一个n*m棋盘,问放两个皇后,使得两个皇后互相能攻击到,有几种放法思路:分横竖,对角线来考虑。横:n * A(m, 2)种竖:m * A(n, 2)种对角线:由于有两条,可以算一条再乘22 * 所有对角线和(A(对角线格数,2))。那么对角线格数为:(1, 2, 3, 4 ... n .n .n .n.n - 1.原创 2014-04-29 12:57:56 · 1177 阅读 · 0 评论 -
UVA 618 - Doing Windows(数论)
题目链接:618 - Doing Windows题意:给定一个大小不能变的屏幕,和四个大小可以变的窗口,变化要保持长宽比,问这四个窗口能不能调整后全部放下正好填满屏幕,不能重叠思路:情况一共就几种:4个叠一起,3个叠一起+一个,2个和2个,一个和两个叠一起在一个,把这几种情况全判断了就可以了,判断过程利用gcd,lcm可以求边长。代码:#include #include lo原创 2014-04-28 12:51:31 · 1555 阅读 · 0 评论 -
UVA 278 - Chess(数论)
题目链接:278 - Chess题意:求出四种棋子最多放几个思路:车能放行列的较小值,王隔着放,皇后根据八皇后问题可知,也是放行列最小值。关键在于马,之前做过一题类似的,马分一行,两行,和两行以上考虑,一行就能全放,两行就隔一个田字格放,三行以上就每个马隔一个位置放。代码:#include #include #include using namespace std;i原创 2014-04-28 12:45:54 · 945 阅读 · 0 评论 -
UVA 11314 - Hardly Hard(数论)
题目链接:11314 - Hardly Hard题意:给定A,B两点,求Y轴上一点C和X轴上一点D,使得该四边形周长最小。思路:B以Y轴做对称点,A以X轴做对称点,然后两点相连就是其他三边的周长,因为两点间线段最短,然后再加上AB长度即可代码:#include #include #include int t;struct Point { double x, y; Po原创 2014-04-27 11:25:33 · 1050 阅读 · 0 评论 -
UVA 808 - Bee Breeding(数论+坐标系)
题目链接:808 - Bee Breeding题意:给定图中蜂窝两点,求最短距离思路:建坐标系,然后根据图中走的顺序把每个点的坐标求出来,然后利用坐标去求最小距离即可代码:#include #include #include #include const int N = 20005;const int d[5][2] = {{-1, 1}, {0, 2}, {1, 1}原创 2014-04-20 12:17:28 · 2799 阅读 · 0 评论 -
UVA 10693 10693 - Traffic Volume(数论)
题目链接:10693 - Traffic Volume根据物理知识, 车经过的时间等于,距离/速度,所以可以列出公式t = (l + d)/v,v/2f + d/v,只有当v / 2f = d/v时,时间最小,v = sqrt(2df),之后时间也能算了。#include #include #include double l, f;int main() { while (~s原创 2014-04-27 11:12:45 · 1533 阅读 · 0 评论 -
UVA 1530 - Floating Point Numbers(数论)
题目链接:1530 - Floating Point Numbers题意:科学计数法。。思路:模拟即可dai原创 2014-04-27 11:27:31 · 698 阅读 · 0 评论 -
UVA 1362 - Exploring Pyramids(计数问题+区间DP)
题目链接:1362 - Exploring Pyramids白书上的例题,思路是对于每个结点,往后遍历分为左右两边子树来考虑,左边的子树为去掉根节点剩下的子树,而右边是要算上根节点的,这样就不会有重复的情况出现,然后根据乘法原理,左右两边情况相乘为总情况数,然后计算这些总和。 f[i][j]表示[i,j]结点的情况种数,那么 f[i][j] = sum{f[i + 1][k - 1] *原创 2014-05-10 12:59:49 · 1741 阅读 · 0 评论 -
UVA 1073 - Glenbow Museum(数论+计数问题+递推)
题目链接:1073 - Glenbow Museum白书上的例题,需要一定的推理。首先要把问题转化,推理出n个点,R的个数为(n + 4) / 2, O的个数为(n - 4) / 2个,因为首先四个角必须为R,然后在中间添加O点,每有一个O点就要多一个R点,所以最后R点比O点多4。然后问题就转化为给定n个R点和m个O点,求出有多少个序列,要求O点不连续,并且R的连续个数不能超过4,的序原创 2014-05-10 13:36:58 · 1891 阅读 · 0 评论 -
UVA 10253 - Series-Parallel Networks(数论+计数问题+递推)
题目链接:10253 - Series-Parallel Networks白书的例题。这题也是需要把问题进行转化,一个并联可以分为几个串联,然后串联可以分成边。如此一来,最后叶子结点种数会是n,问题转化为去分配叶子结点,使得总和为n。书上有两种方法,一种直接去递归,利用组合数学的方式去计算答案。一种是推出递推式:设dp[i][j]为一共j个叶子结点的树,子树的叶子最多的为i原创 2014-05-10 14:02:23 · 1006 阅读 · 0 评论 -
UVA 11038 - How Many O's?(计数问题)
题目链接:11038 - How Many O's?题意:求[a.b]之间,0出现的次数。思路:一开始一直往数位DP上去想,结果发现挺复杂的。。把问题先转化为求0 - num的个数,在用到b的个数减去到a的个数其实只要利用计数的乘法和加法原理,把数字对应的每一位的分成左右两边,利用乘法原理求总数,在用加法原理把所有的总数加起来就是总情况数。那么讨论一下分成两边的情况。举个例子比原创 2014-05-10 19:36:18 · 1036 阅读 · 0 评论 -
UVA 10883 - Supermean(组合数学+数值优化)
题目链接:10883 - Supermean题意:求超级平均数,就是相邻两个算一个平均数,直到剩下一个数,求数值。思路:画图很容易推断出公式。就拿最后一组样例来说1 2 3 4 5 1.5 2.5 3.5 4.5 2 3 4 2.5 3.5原创 2014-05-10 20:01:28 · 1273 阅读 · 0 评论 -
UVA 11361 - Investigating Div-Sum Property(数位DP)
题目链接:11361 - Investigating Div-Sum Property白书上的例题,不过没有代码,正好前几天写了一题数位DP的题目,这题也就相对轻松了。dp[i][x][y]表示加到第i位,数字 % k,数位和 % k的组合情况数,那么现在要添加一个0 - 9的数字上去状态转移为dp[i + 1][(x * 10 + num) % k][(y + num) % k],计原创 2014-05-10 13:04:09 · 1965 阅读 · 1 评论 -
【数论】计数问题的几种基本方法
一、计数原理加法原理:n个方法,每个方法有Pi种方案,那么一共方案数为P1 + P2 + P3... + Pn乘法原理:一件事情有n个步骤,每个步骤需要pi种方案,那么一共有P1 * P2 * P3 * ... * Pn种方案。容斥原理:集合A,B,C。|A U B U C| = |A| + |B| + |C| - |AB| - |AC| - |BC| + |ABC|。依次类推。基原创 2014-05-10 14:20:55 · 4746 阅读 · 2 评论 -
UVA 11645 - Bits(数论+计数问题)
题目链接:11645 - Bits题意:给定一个数字n,要求0-n的二进制形式下,连续11的个数。思路:和 UVA 11038 这题类似,枚举中间,然后处理两边的情况。不过本题最大的答案会超过longlong,要用高精度,不过借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字,这样能保存到2个lo原创 2014-05-11 00:04:08 · 1863 阅读 · 0 评论 -
UVA 10497 - Sweet Child Makes Trouble(DP+高精度)
题目链接:10497 - Sweet Child Makes Trouble题意:n个物品,原来物品属于一个地方,现在要把物品重新放回去,问能放几种使得每个物品都与原来位置不同思路:递推,一开始随便搞了个二维状态,dp[i][j]表示i个物品,有j个位置不同,那么dp[n][n]就是答案,递推式为:dp[i][j] = 1 (j == 0)dp[i][j] = (j - 1) *原创 2014-05-11 13:27:36 · 1440 阅读 · 0 评论 -
UVA 580 - Critical Mass(DP)
题目链接:580 - Critical Mass题意:一个栈,里面可以放L和U,有三个连续的U就是不安全的,问共有几种不安全的情况思路:dp,dp[i][j][k],表示放到第i个,最后两个状态为j,k表示有没有出现不安全。然后去记忆化搜索一下就可以了然后还有一种做法是,先考虑安全的情况,在用总情况(1不过这题都没给数据范围,不过数据其实并不大,不然计算的时候种数一下就会超过范围了原创 2014-05-11 14:13:58 · 1122 阅读 · 0 评论 -
UVA 1393 - Highways (容斥原理计数)
题目链接:1393 - Highways题意:给定一个n * m的点阵,问两两相连后,能组成多少条至少穿过两个点的直线,并且不是水平或垂直的思路:找过两点的线段,由于是整数坐标,只要他的斜率不是整数,即x / y不是整数就能满足答案,然后先记录下这所有的位置,然后利用容斥原理求出对应每个点可以连出多少条这样的线段,最后去求和,求和的时候要注意,由于有一些是重复计算了,比如1 1 和 2 2原创 2014-05-18 09:23:43 · 2202 阅读 · 0 评论 -
UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles题意:求n * m矩形内,最多能组成几个三角形这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对于两点,求他们的gcd - 1,得到的就是他们之间有多少个点,那么情况数就可以求了,然后还是利用容斥原理去计数,然后累加出答案代码:#include #include #include原创 2014-05-18 09:30:30 · 1652 阅读 · 0 评论 -
UVA 11529 - Strange Tax Calculation(计数问题)
题目链接:11529 - Strange Tax Calculation题意:平面上n个建筑物,3个建筑物可以组成一个三角形,计算平均每个三角形内有多少个点思路:问题等价于,求凹四边形的占所有四边形的比例,用O(n^2)的算法,跟 HDU 3629 Convex这题是一个道理代码:#include #include #include #include using原创 2014-05-18 14:14:54 · 1025 阅读 · 0 评论 -
UVA 417 - Word Index(数论)
题意:417 - Word Index题意:每个字符串按题目中那样去映射成一个数字,输入字符串,输出数字思路:这题还是比较水的,由于一共只有83000多个数字,所以对应一个个数字去映射就可以了,注意字符串进位的情况处理即可代码:#include #include #include #include using namespace std;char str[10];ma原创 2014-05-11 13:30:36 · 1429 阅读 · 0 评论 -
UVA 12123 - Magnetic Train Tracks(计数问题)
题目链接:12123 - Magnetic Train Tracks题意:给定n个点,求有几个锐角三角形。思路:和UVA 11529是同类的题,枚举一个做原点,然后剩下点根据这个原点进行极角排序,然后利用two pointer去遍历一遍,找出角度小于90度的锐角,然后扣掉这些得到钝角三角形的个数,然后在用总情况去扣掉钝角就是锐角或直角代码:#include #include #原创 2014-05-18 21:44:56 · 1395 阅读 · 4 评论 -
UVA 11481 - Arrange the Numbers(组合数学)
题目链接:11481 - Arrange the Numbers题意:序列1-n,进行重排,问最后前m个中有k个仍然位置不变的情况数思路:之前写过UVA 580, n个数重排,要求每个位置都不同的情况的题目,递推式为dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2])利用这个,这题只要:k个位置C(m, k) * sum(C[n - m][i] (后面原创 2014-05-18 21:51:31 · 1509 阅读 · 0 评论 -
UVA 10312 - Expression Bracketing(数论+Catalan数)
题目链接:10312 - Expression Bracketing题意:有n个x,要求分括号,判断非二叉表达式的个数。思路:二叉表达式的计算方法就等于是Catalan数的,那么只要计算出总数,用总数减去二叉表达式个数,得到的就是非二叉表达式的个数。那么计算方法是什么呢。看题目中的图,对于n = 4的情况,可以分为这几种情况来讨论:四个1, 一个2两个1,一个3一个1,一个4,对应原创 2014-05-13 22:19:02 · 1202 阅读 · 0 评论 -
UVA 1350 - Pinary(数论+递推)
题目链接:1350 - Pinary题意:二进制数,不能有连续的1,给定第n个数字,输出相应的二进制数思路:先是递推,求出由n位组成的数字中有几个满足条件dp[i] = dp[i - 1] + dp[i - 2],考虑最后一位放0和倒1位放0的情况。然后用一个sum[i]记录满足接着利用二分找到给定的n > sum[i - 1],i的最大值,这个就是所求的答案的最高位。因为原创 2014-05-12 23:00:08 · 1288 阅读 · 0 评论 -
UVA 11889 - Benefit(数论)
题目链接:11889 - Benefit原创 2014-04-13 12:34:28 · 883 阅读 · 0 评论 -
UVA 10780 - Again Prime? No Time.(数论)
题目链接:10780 - Again Prime? No Time.原创 2014-04-13 12:36:44 · 723 阅读 · 0 评论 -
UVA 11609 - Teams(数论+推理+快速幂)
题目链接:11609 - Teams题意:n个人,要挑k个人出来组队,并选一个队长,问有多少不同选法思路::很容易推出答案是C(n, 1) * 1 + C(n, 2) * 2 +...+ C(n,n) * n。即C(n,i) * i (1 代码:#include #include const long long MOD = 1000000007;int t;long原创 2014-04-13 12:50:25 · 1285 阅读 · 0 评论 -
UVA 12050 - Palindrome Numbers(数论+规律)
题目链接:12050 - Palindrome Numbers题意:原创 2014-04-13 12:52:53 · 721 阅读 · 0 评论 -
UVA 11489 - Integer Game(数论+博弈)
题目链接:11489 - Integer Game原创 2014-04-13 12:56:06 · 772 阅读 · 0 评论 -
UVA 11388 - GCD LCM(数论)
题目链接:11388 - GCD LCM题意:给出gcd G, LCM L,求一对数满足gcd = G, lcm = L思路:lcm(a, b) = a * b / gcd(a, b); -> lcm(a, b) / gcd(a, b) = a * b;因此只要G 能整除L 就能找到代码:#include #include int t, a, b;int mai原创 2014-04-13 12:31:00 · 826 阅读 · 0 评论 -
UVA 10892 - LCM Cardinality(数论)
题目链接:10892 - LCM Cardinality原创 2014-04-13 12:40:14 · 671 阅读 · 0 评论 -
UVA 11076 - Add Again(数论+组合数学)
题目链接:11076 - Add Again题意:给定一些数字,要求出全排列后所有得到的数字和(可以有前导零)。思路:组合数学,每个数字出现在每个位置的次数是相同的,然后假设放在某一位置,利用组合数学的方法求出有多少次,然后过程中求和即可代码:#include #include #define min(a,b) ((a)<(b)?(a):(b))long long n,原创 2014-04-13 12:46:01 · 1230 阅读 · 0 评论