随笔分类 - ACM
摘要:递推题意:看题目中的列子就可以知道 ,当n为5时,可行的子集有{1,3,5},{2,4},{2,5},{1,4}1.子集中任意两个元素的差x要2<=x<=3。2.子集要尽可能的长,好像1,3,5,不能是1,3,因为还能加上5然后就是一个很简单的递推,按位递推即可,dp[i]表示用前i个数字能产生多少个子集(并且该子集中包含了第i个元素),那么对于dp[i]来说,决定它的是dp[i-2]和dp[i-3],有第i个元素的子集必定有第i-2个元素或第i-3个元素至于用递推或者记忆化搜索来写都是没问题的#include <cstdio>#include <cstring&
阅读全文
摘要:递推参考:http://hi.baidu.com/gbr12345/item/b1686d3e4d2c5584b611db64题意:输入n要拼成一个3*n的矩形,现有无限的2*1的小矩形可以提供,能有多少种不同的拼凑方案这题一看就觉得是组合数字或者是递推,看了几下确定递推更好做。然后想了下怎么递推。1.就按照n从小到大来推,但是找不出什么规律。2.按照面积来递推,先凑出面积为2的,再面积为4,为6……然后对于3*n的面积是多少就直接输出即可,这种思想感觉非常接近了但是还是不行,因为处理不了重复的情况最后无奈看了解题报告,不过还是不知道原作者怎么想到的这个递推公式#include <cst
阅读全文
摘要:递推题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]另外需要初始化无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1然后就可以开始递推了我是用记忆化搜索来写的#include <cstdio>#in
阅读全文
摘要:递推题意:给出n和k,可用的数字为0,1,2……k,一共有n位数字,现在要求得到一种排列,相邻两个数字相差不超过1,问这种排列的个数占全排列总数的比列要得到全排列的个数就是(k+1)^n , 要得到这个特殊的排列个数用递推即可dp[j][i]=dp[j-1][i-1]+dp[j][i-1]+dp[j+1][i-1];dp[j][i]的意义为第i位数字填j有多少种可能,那么第i位填了j,第i-1必定只可能填j-1,j,j+1才能保证相邻两位差不超过1但主要j=0和j=k的情况另外dp数值要用double#include <cstdio>#include <cstring>
阅读全文
摘要:题意:题目只有一个case,有16个球队,给出名字,并且下面一个16*16的矩阵,p[i][j]是一个二位的整数,表示i球队打败j球队的概率,p[i][j]+p[j][i]=100,下面16行输出球队名字并且后面一个百分率是该球队获得总冠军的概率DP递推或者记忆化搜索都可以设dp[i][left][right]表示i这个球队在第left到第right球队里面得到冠军的概率,所以最后需要的是dp[i][1][16]。一个球队要在当面的阶段得到冠军必须在之前得到冠军所以mid=(left+right)/2; i和j在[left,right]里面争夺冠军(例如i和j在1到16里面争夺冠军,也就是争夺
阅读全文
摘要:概率题给你p和q,表示概率p/q,当有n个红袜子,m个黑袜子时,取两次,两次都是红袜子的概率为p/q,输出n和m,如果不可能则输出impossible设总袜子数为b,红袜子数为a,则a/b*(a-1)/(b-1)=p/q , 可见分子p是a*(a-1)的形式,分母q也是这种形式所以我们用暴力来枚举i*(i-1)分母,并且当分子也能写成j*(j+1)的形式时就找到了解其实这题意义不大也不是什么经典题,能AC也就行了不必太抠#include <cstdio>#include <cmath>long long gcd(long long a , long long b){ r
阅读全文
摘要:数学递推(考查矩阵二分快速幂取模)参考:http://www.cnblogs.com/staginner/archive/2011/12/14/2288187.html输入n和M,简单来说就是要求f(n)%M,而f(n)=2*F(n)-1,F(n)为第n项费波那列数,所以问题转化为求F(n),由于n非常大n (0 <= n < 263-1)所以线性递推会超时,要用矩阵快速幂的方法初始化[F0,F1]=[0,1] , 要求[Fn,Fn+1][F0,F1] * |0 1| (n) = [Fn,Fn+1] (不考虑高精度) |1 1|用二分的方法求解|0 1| (n) ...
阅读全文
摘要:组合数学,递推(Catalan number , 卡特兰数)题目:给n个数字,能构建成多少种二叉排序树。这个问题并不难,用递归的思想就能解决。当空树即n=0时方案数为1,当n=1时方案数同样为1。当n>=2时,我们把n个数按升序排列,如果我们选ai作为数树根,那么a1……ai-1必定在有子树,ai+1……an必定在左子树,左子树有i-1个元素,同样是排序二叉树,相当于问这个i-1个元素又能组成多少个二叉排序树,右子树有n-i个元素,同时是二叉排序树,相当于问这n-i个元素能组成多少个二叉排序树,方案数为两者相乘。对于每个ai作为树根的计算方法如上,而所有的ai都能作为树根,所以不能总结出
阅读全文
摘要://概率题//先求出每一次中,抽到两个红球的概率为pi,qi=1-pi,表示每一次中不是抽到两个红球的概率//pi=(1/i)*(1/(i+1))=1/(i*i+i)//题目要求所有抽取中,至少有一次抽到两个红球的概率//我们算出所有抽取中,每次都没有抽到两个红球的概率Q=(q1*q2*q3……qn),则1-Q为所求答案//另外要求出,每一次都抽到两个红球的概率,即P=(p1*p2*p3……pn)//但P这个数值必定非常小,所以题目只需要输出P小数点后有多少个连续的0//我们来分析P这个数字,令P=10^a,易知a是个负数,令a=i+d,i为整数部分,d为小时部分//则P=10^i*10^d,
阅读全文
摘要:DP(DAG最长路)题意:给出x轴上的线段的端点坐标,一个线段能覆盖另一个线段(端点不能相同),求出最多的线段覆盖并且从短到长给出路径。转化模型为DAG,求DAG上的最长路并且打印路径,用记忆化搜索实现#include <cstdio>#include <cstring>#define N 550int a[N],b[N],n;bool g[N][N];int dp[N],path[N];void dfs(int i){ if(dp[i]!=-1) return ; dp[i]=1; for(int j=1; j<=n; j++) if(g[i][j]) { ..
阅读全文
摘要:DP(解码)题意:给出一个串的长度n,串只有0,1组成,但是不能有两个相邻的1。按字典序给串排列,最先肯定是0000,接着是0001,依此类推。给一个数字m,输出在长度为n的情况下,第m个排列的串是什么,如果m大于总排列数,输出-1这其实是一个解码的过程,必须用高位到低位解码(从左到右),因为这里要求字典序,字典序的比较水从左到右的由于数据规模固定在串长度44以内,所以我们先dp出所有长度下可能的排列数,编码时也要用每次编码按位编码,判断当前位为0还是为1,就是看填0或1可能产生多少排列数然后和m比较,这个看代码大概都能懂的#include <cstdio>#include <
阅读全文
摘要:数学题:(组合数学,分解质因子)题意就是C(m,n)/C(s,t),凡是组合数就提醒我们要注意数据范围,一般处理组合数学问题的策略就是能约分的先约分,能化简的先化简,能除的先除,不要全部乘起来再除掉1.转化公式C(m,n) = [m*(m-1)*(m-2)...(m-n+1) ] / [ n!]2.两者相除C(p,q)/C(r,s) = [ p*(p-1)...(p-q+1) * s!] / [ r*(r-1)....(r-s+1)*q!]但是不能全部乘起来再除(爆),也不能一边乘一边除(精度),把每个数字分解质因子,分子中分解出来的质因子,个数增加,分母分解出来的质因子,个数减少最后查看所有
阅读全文
摘要:数学题(概率,精度)题意:n个人丢骰子,丢到某个点数为赢然后结束,从第1个人开始丢然后依次下去,然后循环回来,直到有人赢为止。输入n个赢,每个人丢到目标点数的概率,第m个人,求第m个人赢的概率算出在第一轮中第m个人赢的概率q1算出第2轮中第m个人赢的概率q2……………………算出第k轮中第m个人赢的概率qkans=q1+q2+q3+q4……+qk其中要设置一个精度qk<E , E的精度随便搞一个都差不多了#include <cstdio>const double E=1e-10;int main(){ int T,n,m,c; double p,ans,t,q; scanf(&
阅读全文
摘要:数学题(字符串的解码与编码,涉及组合数学)题意:给你一个字符串,它们的全排列中有一些字符将会是回文串,单独把这个些回文串拿出来,按字典序给他们从1开始编号。然后输入数字n,把第n个回文串输出。这题第一次看完全不会放下几天,今天再看瞬间想通。首先这题要从回文串的性质分析:一个回文串如果长度为偶数,那么可以确定,每种字符的个数一个是偶数,不会有字符的个数为奇数。如果一个回文串为奇数,那么可以确定,一定有且仅有一种字符的个数为奇数,其他字符的个数都会偶数,而且整个回文串中间的那个字符必定是为奇数的那个字符。所以对于长度为奇数的回文串,我们可以暂时除掉中间的那个字符(因为它是固定一定要在那里,没什么研
阅读全文
摘要:数学题(概率题)题意:有牛和车躲在门内,你做一个选择,但是还不能看答案,然后知情人会帮助你,你会打开几个门里面全是牛,但是注意一点,知情人知道你选的那个门里面是牛还是车,但即便他知道是牛他也不能告诉你。知情人打开门后,你必定重新选择另一个门(要是可能保持不变的话又不同了),问你这次选到车的概率多少这题一开始看错题意,想了很久觉得这题怎么这么难,后来才搞清楚其实就是一不计算输入a,b,c, a牛,b车,知情人会一次性打开c个门(注意是一次性全部打开c个门,要是一次打开一个的那完全不同了,另外还注意一点,如果你选的就是牛,虽然知情人能打开c个门,但是它不能打开你那个,而题目有一个条件 0<=
阅读全文
摘要:数论题:幂取模给出a和n,求a^n的前3位和后3位关于求后3位,就是一个二分并且模1000即可,至于怎么求前3位,需要一些数学分析我们来看一大数nn可以写成n=10^b,这个a是个小数所以b=i+d,i是整数部分,d是数部分则n=10^(i+d)=10^i * 10^d这里很重要,10^i其实有什么用?i是整数,所以10^i一定是1000…………000,然后*10^d,d是一个小于1的小数(别忘了是b的小数部分)所以决定n这个大数会出现什么数字的,是10^d,10^i只是给10^d起到往后移动小数点的作用所以我们要知道10^d另外我们知道0<=d<1,所以 10^0 <= 1
阅读全文
摘要:数学题(我更觉得是恶心模拟)题意很清楚,就是给一个高精度整数,求它的平方根,数据保证一定是整数解这个东西要用高精度各种搞(看过别人的报告说有些不用高精度,没心机看下去,自己硬是写了一堆高精度),主要就是模拟手算的方法手算的方法这里说得很清楚了(希望看得到图片吧)开根方法笔算开根法: 例1:求①将37625从个位起,向左每两位分一节:3,76,25②找一个最大的数,使它的平方不大于第一节的数字,本题中得1(1的平方为1,而2的平方为4,大于3,所以得1).把1写在竖式中3的上方。③将刚才所得的1平方写在竖式中3的下方,并相减,然后将76移写在本行(如图)④将前面所得的1乘20,再加一个数a,写在
阅读全文
摘要:数学题(组合数学 或者 DP递推都可以)题意就不说了比较好懂。这题如果按照题意去模拟着思考是很难解决的,我们换一种思维,抓住一个特殊条件,将问题进行转化。无论是组合数学的方法计算还是DP递推,都是转化问题后才进行的。我们看做有n个不同的盒子,很t个完全相同重量为1的球。按照题意,每个盒子的重量不能小于p,那么我们干脆先每个盒子都放p个小球。剩下m=t-n*p个小球。那么无论这m个小球怎么放都是符合要求的。所以问题就转化为,将m个完全相同的小球放在n个不同的盒子里,盒子内可以装一个或多个小球或者为空。组合数学:即便是“将m个完全相同的小球放在n个不同的盒子里,盒子内可以装一个或多个小球或者为空”
阅读全文
摘要:数论题:线性方程看了《数论概论》的相关章节-《线性方程与最大公因数》首先是要证明一个方程必定有整数解ax+by=gcd(a,b); 为方便 g=gcd(a,b), ax+by=g这个证明有些复杂就不写了,而如何构造一个可行解(x1,y1)其实也在证明过程中在得到一个可行解后就可以得到无数组解,他们是(x1-k*(b/g) , y1+k*(a/g)) , (其中g=gcd(a,b),k是整数)而对于方程ax+by=c,只要c是g倍数那么就有整数解,否则没有看完原题,p是x/k的下整,q是x/k的上整,然后p*m+q*n=x,这个方程其实就是ax+by=c的形式,而且这个方程一定有整数解因为d=g
阅读全文
摘要:线段树:一整段区间修改数值,并询问一段区间的和(不过这里询问的整个区间的和,固定的,当然原理是一样)这题要用到LAZY标记,决定自己写一下LAZY标记先说题意:一个连续的线段,材料可能为金银铜,数值对应3,2,1,一开始所有单元都是铜,所以整段的和就是n。然后多个修改操作,每次为x,y,z把区间[x,y]的每个单元都变为数值z。z的值为1,2,3。所有的修改操作做完后,输出整个线段的和然后说一下LAZY思想的本质,就是“只做表面功夫,内部其实不合格,当某一次需要访问到内部的时候,再对内部处理”,这种偷懒的思想就能减少操作的次数,因为每次访问到线段树的深度不一定一样,不需要全部都处理掉。这个思想
阅读全文

浙公网安备 33010602011771号