
===== ACM相关 =====
ITCharge
高效率编程,慢节奏生活。
展开
-
HDU5493 Queue【线段树】
题目大意:有 N 个人排队,每个人都忘记自己的位置。但是每个人都知道自己的身高 Hi 和自己前边或后边有 Ki 个比自己高的人。给你每个人的 Hi,Ki,求按身高满足最小序的情况。如果不满足最小序的情况,则输出"impossible"。解题思路:题目要求输出身高字典序最小的情况,那么先对身高按从小到大排序。然后按身高从小到大确定每个人的位置。由于每次都是从小到大,则每次放进的人都是比之前的人高的。设当前放进的人是身高从小到大第 i 个人,如果要满足他前边或后边刚好有 k 个人比他高,则:原创 2015-10-03 17:19:59 · 972 阅读 · 0 评论 -
POJ1001 Exponentiation【高精度】
题目大意:给你一个浮点数 s 和整数 N,求 s 的 N 次方。其中(0 < N <= 5),而浮点数 s 算上小数点共占 6 位。解题思路:考虑到浮点数 s 最多只有 6 位,且 N 最多为25,那么通过 s 的小数点位置计算出小数点在 s 的 N 次方的结果中的位置。然后将 s 变为不含小数点的整数 num,通过高精度乘以单精度的模板求出 num 的 N 次方。然后根据题目要求输出结果。注意:不仅要清除整数部分的前导 0,还要清除小数部分后边的 0。原创 2015-09-17 11:40:45 · 636 阅读 · 0 评论 -
POJ3252 Round Numbers【组合问题】
题目大意:给你两个十进制数 A 和 B,求其对应闭区间 [A,B] 内有多少个Round Numbers。Round Numbers 是指:如果一个十进制数对应的二进制数中的 0 的个数多于 1 的个数,则该数就是一个 Round Numbers。解题思路:参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122758.html计算闭区间 [A,B] 内有多少个Round Numbers,只需要分别求出[0原创 2015-08-31 21:34:36 · 651 阅读 · 0 评论 -
POJ1496 Word Index【全排列】
题目大意:和给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列)。解题思路:和 POJ1850 一模一样。参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122771.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1。不符合第一步的话,则分为两步计算str的字典序位置。先计算比 str 的长度少的字符串总个数。再计算长度和 str 一样,比 str 字典序的字符串原创 2015-08-25 21:11:46 · 786 阅读 · 0 评论 -
POJ1850 Code【全排列】
题目大意:给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列)。解题思路:参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122760.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1。不符合第一步的话,则分为两步计算str的字典序位置。先计算比 str 的长度少的字符串总个数。再计算长度和 str 一样,比 str 字典序的字符串的个数。先来看第一原创 2015-08-25 21:01:16 · 1462 阅读 · 0 评论 -
ZOJ2835 Magic Square【幻方验证】
题目大意:给你一个N阶的矩阵,判断是不是N阶幻方。其中使用的数字不一定是1~N^2,但是数字一定不能有重复的。解题思路:根据幻方的定义,遍历判断下所有横行、竖行、斜行的和是否相等,并且用Flag[]数组来判断是否有重复数字存在。原创 2015-08-21 13:09:09 · 1484 阅读 · 0 评论 -
POJ1286 Necklace of Beads【Polya定理】
题目大意:给定3种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。问能做成多少种不重复的项链,最后的结果不会超过int类型数据的表示范围。并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。解题思路:这道题和POJ2409是一样的题目,只不过这道题规定了颜色数目。Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象着色,则不同的着色 方原创 2015-08-20 18:48:54 · 1557 阅读 · 0 评论 -
POJ2409 Let it Bead【Polya定理】
题目大意:给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。问能做成多少种不重复的项链,最后的结果不会超过int类型数据的表示范围。并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。解题思路:Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象着色,则不同的着色 方案数为: |G|^(-1) *原创 2015-08-20 11:31:48 · 4097 阅读 · 0 评论 -
POJ2369 Permutations【置换群】
题目大意:给定一个序列,问最少需要多少次置换才能变为 1、2、…、N 的有序序列。比如说给定5个数的序列 4 1 5 2 3,表示置换为:( 1 2 3 4 5 ) ,即 (1 4 2)(3 5) 4 1 5 2 3解题思路:对于每一位找到自己轮换内轮换到自己的次数,求不相交的轮换之间的次数的公倍数,即为最终结果。原创 2015-08-19 17:24:07 · 874 阅读 · 0 评论 -
POJ2356 Find a multiple【鸽巢原理】
题目大意:给你N个正数的序列,从中找到连续的若干数,使得其和刚好是N的倍数。解题思路:典型的抽屉原理。Sum[i]为序列中前i项的和。则有两种可能:1.若有Sum[i]是N的倍数,则直接输出前i项。2.如果没有任何的Sum[i]是N的倍数,则计算ri = Sum[i] % N。根据鸽巢原理,肯定有Sum[i] % N == Sum[j] % N,i != j。则第 j 到第 i 项数的和即为N的倍数。原创 2015-08-18 11:19:52 · 798 阅读 · 0 评论 -
ZOJ3556 How Many Sets I【容斥原理】
题目大意:有一个集合S,S有N个元素,从S的子集中选k个集合,使得他们的交集为空。给你集合的元素个数N和K,求满足情况的个数。解题思路:元素个数为N的集合S的子集共有2^N个,现在从子集中选出K个集合(可重复选)的有序组合,使得他们的交集为空。已知从子集中选K个有序组合总数为SUM = 2^(N*K)。设F(x)为K个集合的有序组合个数(其中至少包含一个x)。则F(x1 & x2)表示K个集合的有序组合个数(其中至少包含一个x1和一个x2)。F(x1 & x2 & … & xk)表示K个原创 2015-08-14 21:02:22 · 853 阅读 · 0 评论 -
POJ3904 Sky Code【容斥原理】
题目大意:给你N个整数,从这N个数中选择4个数,使得这四个数的公约数为1。求满足条件的四元组个数。解题思路:四个数的公约数为1,并不代表四个数两两互质。比如(2,3,4,5)公约数为1,但是2和4并不互质。从反面考虑,先求出四个数公约数不为1的情况个数,用总的方案个数减去四个数公约数不为1的情况个数就是所求。求四个数公约数不为1的情况个数,需要将N个数每个数质因数分解,纪录下所有不同的素因子所能组成的因子(就是4个数的公约数),并统计构成每种因子的素因子个数,和因子总数。然后再计算组合数原创 2015-08-13 11:18:16 · 2417 阅读 · 1 评论 -
POJ2773 Happy 2006【容斥原理】
题目大意:给你两个整数N和K,找到第k个与N互素的数(互素的数从小到大排列),其中(1 <= m <= 1000000,1 <= K <= 100000000 )。解题思路:K很大,直接从小到大枚举找出不现实,只能二分答案。二分枚举[1,INF]范围内所有的数x,找到1~x范围内与N互素的数个数,如果等于K,则就是结果。然后考虑1~x范围内与N互素的数个数 = x - 1~x范围内与N不互素的数个数1~x范围内与N不互素的数个数用简单的容斥定理来求即可。原创 2015-08-12 17:55:51 · 1433 阅读 · 0 评论 -
ZOJ2836 Number Puzzle【容斥原理】
题目大意:给N个整数,和一个整数M。求小于等于M的非负整数(1~M)中能被这N个数中任意一个整除的数的个数。解题思路:设S1为1~M中能被第一个整数A1整除的集合,S2为1~M中能被第二个整数A2整除的集合。……Sn为1~M中能被第N个整数An整除的集合。然后每个集合个数,其实就是M / An。再根据容斥原理,求集合并集的元素个数即可。原创 2015-08-11 19:40:24 · 901 阅读 · 0 评论 -
POJ3984 迷宫问题【BFS】
题目大意:用一个5*5的二维数组表示迷宫,输出左上角到右下角的最短路径。思路:用BFS求最短路径。用pre[]来记录每个状态之前的状态,然后递归输出路径。原创 2015-05-18 13:03:30 · 3239 阅读 · 0 评论 -
HDU1358 Period【KMP】
题目大意:给你长度为N的字符串s,求字符串s的循环前缀的长度和循环的次数。例如:长度为8的字符串:"abababab"长度为4的前缀"abab",循环前缀为"ab",循环2次长度为6的前缀"ababab",循环前缀为"ab",循环3次长度为8的前缀"abababab",循环前缀为"ab",循环4次则输出:4 26 38 4思路:KMP算法中Next[j]求的是第j个位置失配之后返回的匹配位置,即S[0]~S[Next[j]]与S[j-1-Next[j]]~S[j-1]是相同的,对于原创 2015-04-26 10:40:14 · 933 阅读 · 0 评论 -
HDU2203 亲和串【KMP】
题目大意:给定亲和串的定义:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。现在给你两个字符串s1和s2,判断s2是否是s1的亲和串。思路:先判断s2的串长度是否小于等于s1的长度,因为如果s2的串长度比s1还要长的话,s2是不可能是s1的亲和串。然后在s1的串后边在街上s1的串,对s1和s2进行KMP算法,看s1的串中是否包含s2的串,如果包含,则s2就是s1的亲和串,否则就不是亲和串。原创 2015-04-26 09:32:34 · 996 阅读 · 0 评论 -
HDU1425 sort【水题】
题目大意:给你N和M,然后给你N个数,输出前M大的数。思路:数据范围为-500000~500000,N的范围为1000000。两种做法。1).建个1000000数组,存N个数,用sort排下序,输出前M大的数,这样提交900+MS,有时会超时。2).建个1000000数组,用下标表示数值,输入一个数,就将对应下标的数值加一。最后从后向前遍历,找到M个数并输出。原创 2015-04-25 22:25:10 · 3050 阅读 · 0 评论 -
POJ2185 Milking Grid【KMP】
题目大意:有一个N行M列的字符矩阵,这个字符矩阵可以由较小的矩阵重复平铺组成整个矩阵。问:最小的字符子矩阵的面积为多少。思路:对于长度为M的每一行s[i]来说,M-Next[M],M-Next[Next[M]],…都是能通过复制,完全覆盖字符串的可行串,而M-Next[M]是最小的。遍历每一行,求出对所有s[i]都可行的最小字符串长度,即每一行M-Next[M]的最小公倍数lcmn。再用类似的方法求出长度为N、对每一列都可行的最小字符串高度,即每一列N-Next[N]的最小公倍数lcmm。则原创 2015-04-21 19:49:14 · 1098 阅读 · 1 评论 -
poj3461 Oulipo【KMP】
题目大意:给一个字符串T,表示文章,再给一个字符串W,表示单词。T和W都只包含26个大写英文字母。现在计算单词W在文章T中出现的次数。W在T中出现的次数必须连续完全匹配,没两次匹配可能有重叠的部分。思路:先求出字符串W的Next[]指针,然后进行匹配,当一次匹配成功后,继续回退到Next[j]向后进行匹配,直到字符串T的末尾。此时,得到的匹配成功次数为所求,即W在T中出现的次数。原创 2015-04-21 10:41:03 · 966 阅读 · 0 评论 -
POJ2406 Power Strings【KMP】
题目大意:给定两个字符串a和b,定义a*b为两个字符串的链接。比如,a = "abc",b = "def",则a*b ="abcdef"。这个定义当作是多项式。则一个字符串的非负整数次幂可定义如下:a^0 = "",a^(n+1) = a*a^n。现在给你一个字符串s,求出最大的n,满足s = a^n(a为s的某个子串)。比如s = "aaaa",则n最大为4,a = "a",s = "a"^4。思路:对于给定的字符串s,最短的重复子串a是s[Next[len]] s[Next[len+1]原创 2015-04-21 10:21:48 · 735 阅读 · 0 评论 -
HDU1051 Wooden Sticks【贪心】
题目大意:有N根木棍,每根木棍的长度和质量是已知的,机器要处理这N根木棍,处理时间和木棍的长度和权重有关。第一根木棍的处理时间为1min,之后处理的木棍如果长度大于等于前一根木棍的长度并且权重也大于等于前一根木棍的长度,就不需要处理时间;否则就需要1min的处理时间。问:最小的处理时间为多少。思路:贪心思想。先将木棍按长度从小到大排列,如果长度一致,则按权重从小到大排列。然后根据题目要求,如果后边的木棍长度和权重都大于前者,则不需要处理时间,否则加1min处理时间。原创 2015-04-18 14:02:23 · 975 阅读 · 0 评论 -
POJ2394 Checking an Alibi【Dijkstra】
题目大意:有F个农场,标号为1~F。1号农场为谷仓。有C头奶牛在这些农场上,他们喜欢偷吃谷子,但是在偷吃谷子前M秒,有个摄像头会将它们的位置记录下来。各个农场之间有P条通路,并且知道这P条路的行走世间。如果奶牛可以在M秒之内赶到谷仓,就可以偷吃到谷子。问:有多少奶牛可以偷吃到谷子,并升序输出它们的序号。思路:最短路径问题。用Dijkstra算法求出1号谷仓到各个农场的最短时间,然后看奶牛所在的农场到谷仓的时间是否小于等于M,如果小于等于则存入结果数组ans[]中。原创 2015-04-16 21:06:56 · 998 阅读 · 0 评论 -
POJ2001 Shortest Prefixes【字典树】
题目大意:给一些字符串,求出每个字符串在这些字符串中能可以被唯一识别的最小前缀。思路:字典树的模板题,结构体中庸Count来存储字符前缀出现的次数,字典树中找到第一个Count为1的前缀时,该前缀就是被唯一识别的最小前缀。原创 2015-04-15 09:40:26 · 897 阅读 · 2 评论 -
HDU1079 POJ1082 Calendar Game【博弈】
题目大意:有一个日期游戏,胜利时间是2001年11月4日。玩家可以从当前日期移动到下一天,也可以移动到下一个月的今天,比如从2000年3月3日可以移动到2000年3月4日,也可以移动到2000年4月3日。当然,移动到下一个月的当前日期的前提是那一天是存在的,比如说2001年1月31日,只能移动到2001年2月1日,而不能移动到2001年2月31日,因为那天不存在。问:给你一个日期,玩家是否能依靠上述规则,从当前日期移动到2001年11月4日从而赢得比赛。思路:这是一道博弈题,2001年11月原创 2015-04-08 10:53:34 · 864 阅读 · 0 评论 -
HDU2709 Sumsets【递推】
题目大意:将一个整数N分解成2^i相加的形式,共有多少种分法。例如:7 = 1+1+1+1+1+1+1 = 1+1+1+1+1+2 = 1+1+1+2+2 = 1+1+1+4 = 1+2+2+2 = 1+2+4,共有6种分法。思路:设a[n]为整数n分解成2^i相加形式的分法个数。当n为奇数时,n-1为偶数,n = 1 + n-1,分解出一个1,再分解偶数n-1,也就是a[n-1]种分法。当n为偶数时,有两种分解方法。1):相加的2^i中含有1。因为n为偶数,所以至少有两个1,即n = 1原创 2015-04-08 10:19:13 · 1280 阅读 · 0 评论 -
HDU1728 逃离迷宫【BFS】
题目大意:有一个M*N的矩阵迷宫。其中,字符'.'表示此处为空地,字符'*'表示此处为障碍。在迷宫中,只能向相邻的上、下、左、右方向走。而且在走的时候,转弯最多不能超过k次。给你初始位置(x1,y1),终止位置(x2,y2),问:是否能从初始位置走到终止位置。思路:建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数。搜索四个方向,并记录下转弯数,如果转弯数大于或等于k,则继续另外的搜索。直到搜索到终止位置,返回1。如果最后也没有搜到,返回0。原创 2015-04-05 23:22:28 · 1024 阅读 · 0 评论 -
HDU1719 Friend【数学规律】
题目大意:我们来递归定义一个友好数:(1)整数1、2是友好数(2)如果a和b是友好数,那么a*b + a + b也是友好数(3)只有用(1)和(2)定义的数是友好数。现在给你一个数n(0 <= n <= 30),判断n是否是友好数思路:挺有意思的一道简单数学题。设n是一个友好数,那么n就可以分解为:n = a*b + a + b = (a+1)*(b+1) - 1,即n+1 = (a+1)*(b+1)由递归定义,这里的a和b也必须是友好数。a = a1*b1 + a1 + b1 = (a原创 2015-03-30 11:31:29 · 1122 阅读 · 0 评论 -
HDU1787 GCD Again【欧拉函数】
题目大意:给你一个整数N,求范围小于N中的整数中,与N的最大公约数大于1的整数的个数。思路:典型的欧拉函数变形。欧拉函数φ(N)是用来求小于N的整数中,与N的最大公约数为1的数的个数。那么此题的答案ans = N - φ(N) - 1。原创 2015-03-30 11:12:51 · 1425 阅读 · 0 评论 -
POJ2447 RSA【公匙密码】
题目大意:RSA是个有名的公匙密码系统。在这个系统中,每个参与者有一个只能自己知道的私匙和一个每个人都知道的公匙。为了安全地把信息传递给对方,应该用公匙对信息进行加密,对方用自己的私匙进行解密。对RSA系统的描述如下:首先,选择两个大素数P、Q,计算N = P * Q。然后,选择一个正整数E作为加密密匙,令T = (p-1)*(q-1),且gcd(E,T) = 1。最后,计算解密密匙D,使得(E * D) mod T = 1,这里D是E模T的逆元。公匙表示为{E,N},私匙表示为{D,N},P原创 2015-03-28 10:32:18 · 1354 阅读 · 0 评论 -
POJ2159 Ancient Cipher【字符密码】
题目大意:古罗马帝王的保密服务部门的保密方法是替换和重新排列。替换方法是将出现的字符替换成其他的字符。如将'A'替换成'Z',将'Z'替换成'A'。排列方法是改变原来单词中字母的顺序。例如将顺序变为<2,1,5,4,3,7,6,10,9,8>。应用到字符串"VICTORIOUS"上,则可以得到"IVOTCIRSUO"。单用一种解密方法是不安全的,只有将两种方法结合起来才安全。那么问题来了:给你一个原文字符串和加密字符串,问是否能通过这两种加密方法结合,从而由原文信息得到加密信息。如果能则输出"原创 2015-03-28 10:02:05 · 2046 阅读 · 0 评论 -
POJ3749 破译密码【字符密码】
题目大意:凯撒大帝的加密方法是:将原文的每个字母分别用该字母后边的第5个字母替换。现在给你加密后的信息,问信息原文是什么。思路:将加密消息的ASCII码值减去5,低于'A'字符的,ASCII码再加上26。直接输出即可。原创 2015-03-27 17:11:16 · 1473 阅读 · 0 评论 -
POJ2992 Divisors【因子个数】
题目大意:求解出组合数C(n,k)的约数个数。思路:数据中的n和k值都比较大,直接求解显然不可以。求约数个数,要先进行素因子分解。C(n,k) = n!/(k!*(n-k)!)。n范围小于等于431,可以先筛选出431以内的素数,用数组Primer[]来存储素数。对每个阶乘进行素因子分解,用数组jie[i][j]来表示阶乘i进行分解式第j个素数的幂。然后求组合数的素因子分解,利用公式得到因子个数。原创 2015-03-24 20:50:24 · 1861 阅读 · 1 评论 -
POJ1320 Street Numbers【佩尔方程】
题目大意:求解两个不相等的正整数N、M(N<M),使得 1 + 2 + … + N = (N+1) + … + M。输出前10组满足要求的(N,M)。思路:要使 1 + 2 + … + N = (N+1) + … + M,那么 N*(N+1)/2 = (M-N)(M+N+1)/2,即(2*M+1)^2 - 8*N^2 - 1,令x = 2*M + 1,y = N,就有x^2 - 8*y^2 = 1,就变成了典型的佩尔方程,已知x1 = 3,y1 = 1,由迭代公式得:xn = x(n-1)*原创 2015-03-19 21:58:52 · 909 阅读 · 0 评论 -
HDU1172 猜数字【水题】
题目大意:计算机随机产生一个四位数,然后玩家去猜这个四位数,每次猜测,计算机都会告诉你猜对了几个数字,有几个数字在正确的位置上。现在给你N组猜测的结果,那么问题来了:能否根据这几组猜测的结果去确定这个四位数是多少。如果能确定,输出这个四位数。如果不能确定,输出:"Not sure"。思路:只是四位数的话,暴力枚举就可以了。找到满足这几组猜测结果的四位数。如果只有1个,就输出这个数。如果是0个或是多于1个,就输出:"Not sure"。原创 2015-02-14 21:57:53 · 1439 阅读 · 0 评论 -
HDU2589 正方形划分【DFS】
题目大意:有一个边长为L的正方形有L*L个小正方形,将N个小石子放在N个小正方形中,给你N个小石子所放位置,那么问题来了:能否将这个变成为L的正方形分割成N个正方形,使得每个正方形中都含有1个小石子,并且这N个正方形正好构成整个正方形。测试样例1说明:边长为5的大正方形里有8个小石子,正好能将大正方形分解成8个小正方形,且每个正方形中有1个小石子。思路:用DFS来做这道题。用Num[i][j]来表示从(1,1)到(i,j)的矩形中有多少个小石子(用来计算小正方形中含有的小石子数),用v原创 2015-02-09 10:18:47 · 1667 阅读 · 0 评论 -
HDU3117 Fibonacci Numbers【数学】
题目大意:给你一个整数N(0 <= N <= 10^8),求斐波那契数列第N项F[N]的前四位数字和末尾四位数字。思路:斐波那契数列是一个很大的数,直接暴力枚举显然不科学。先考虑末尾4位是否有循环节,写个程序发现循环节是15000,直接用数组存储前15000的斐波那契数列的末尾4位。至于斐波那契数列的前4位。通过计算得出N >= 40之后,F[N]就大于8位数了。对于N < 40的部分可以直接输出结果,对于N >= 40的部分,考虑公式 F[N] =(1/√5) * ( ((1+√5)/2)^原创 2015-02-08 22:41:33 · 876 阅读 · 0 评论 -
HDU2700 Parity【水题】
题目大意:给你一个01字符串,末尾为'e'或是'o',分别代表偶校验和奇校验。输出正确的01字符串。偶校验表示:算上最后的'e'位,总共有偶数个1。奇校验表示:算上最后的'o'位,1总共有奇数个。思路:统计除末尾外1的个数,然后再判断末尾应为0还是1。然后赋值输出字符串。原创 2015-02-01 21:37:42 · 937 阅读 · 0 评论 -
HDU2549 壮志难酬【水题】
题目大意:给你一个小数(肯定有小数点),和一个整数N,求小数点后第N位是多少。思路:直接用字符串存储小数,找到小数点的位置。然后先判断小数点后够不够N位,够N位就输出小数点后第N位上的字符,否则输出"0"。举个例子说明下:1.2 3 实际上是1.2000 3 小数点后第3位原本没有,所以用0补齐。原创 2015-02-01 21:21:22 · 865 阅读 · 0 评论 -
HDU2568 前进【水题】
题目大意:N只蝙蝠,A剑招能杀死一半蝙蝠,B剑招能杀死一只蝙蝠。规则是:如果是奇数,就用B剑招杀死一只,再用A剑招杀死一半;如果是偶数,直接用A剑招杀死一半。如此反复,直到杀死全部的蝙蝠。问:最后用了多少招B剑招。思路:用NumB来统计用B剑招的次数。while循环,N为0跳出循环。如果N为奇数的话,就N--,NumB++。如果N为偶数的话,N /=2(N >>= 1)。原创 2015-02-01 20:47:32 · 1192 阅读 · 0 评论