部分acm题目的解题思路(转)

来源:互联网 发布:c语言segment fault 编辑:程序博客网 时间:2024/05/16 06:37

Problem 1346 - Exchange 用棋盘多项式和数论中的扩展欧几里德来做. 根据题意可以构造一个棋盘,用阴影代表禁区,可得到禁区都是分开的正方形n*n..n*n正方形小格子禁区的棋盘多项式为

f(n)=,m[110]存各学校的人数,n表示学校数,总人数为s,那么大棋盘多项式为f[m[0]]*f[m[1]]*...*f[m[n-1]];然后用一个数组xishu[10001]存多项式的各项系数,下标代表X的幂数,值代表系数,sum代表要求的结果,那么sum=(xishu[0]*s!-xishu[1]*(s-1)!+xishu[2]*(s-2)!-.....+...xishu[s]*0!)/(m[0]!*m[1]!*m[2]!*....m[n-1]!);

用计算机程序语言来实现并不和分析数学题一样容易,得到上面的结论用的时间不到半个小时,写程序写了一个半小时.才大致写好,接着就是狂提交了.终于在提交了2个半小时左右过了..这个题目感觉比较麻烦,用的数组有好6个..阶乘a[i]=i!%MOD;组合数C[m][n]=C(m,n)%MOD; 小多项式的系数,xs[110][110],xs[m][n]代表m*m的禁区多项式,n代表X的幂数,值代表系数..我原来用一种简单的方法求组合数方法一直不过,换成扩展欧几里德算法来求就过了;原来我以为求这个棋盘多项式的过程中可能要超时,结果没有,差几十ms就超时了. 还有人数可能为0的情况..

Problem 1349 - Matrix 先找到最开始的子矩阵,然后向上向下向左向右扩展,外部用个while循环,来控制扩展结束..一开始RE了好多次,后来才发现原来行与列我弄反了.

Problem 1102 - Knuthocean 组合数学题,Polya定理..先考虑旋转,旋转len次,每旋转一次记录一下坐标的变换,然后找置换群的循环节,然后就是翻转.同上..由于数据太大,用C/C++写要使用高精度,所以直接用java写了,省事又方便.

Problem 1333 - File Fragmentation 感觉我的算法有问题,可能是数据弱的原因我水过了..我先定义一个结构体,记录字符串值,0和1的个数,然后算出每个字符串的平均长度..再按长度排一下序,然后开始找...

6.22~24

Problem 1106 - String's Puzzle 这题要用到大数乘法,以前看到时推出了公式,但是因为有大数乘法,我懒得写了,最近学了点Java,用java写了后提交因为一个变量定义错了让我检查好长时间,只好用C写了个提交了.然后检查出来Java变量错误了,再用java提交ac.

Problem 1250 - Java vs C++ 这题提交了两天,把gets()改成scanf()就AC了,超级郁闷~!!简单的模拟题.

Problem 1251 - Kickdown WA了一小时,又是把gets()改成scanf()就AC了..题目意思是:给出的数字字符串两段,要求的是两段能置于容器高度为3中的最短长度. 简单题

6.9

Problem 1134 - Card Game 贪心..结构体二级排序.如果数值不等,就按数值大小排序,如果相等.按牌色大小排序..然后直接线性比较就可以得到结果,跟Tian Ji -- The Horse Racing这个题差不多,不过这个要简单一些,不用考虑等于的情况.

Problem 1276 - Power Calculus 前几天做的忘了记录了.这个题得搜索,得把不符合条件的状态都剪掉.我用时也比较多.

Problem 1338 - Coins 很怀疑这个题目OJ数据有问题~!WA了好多次了,至今仍WA,应该不可能错啊....先可以推出一个组合数学的公式(a[0]+a[1]+...+a[n-1])!/(a[0]!*a[1]!*....*a[n-1]!),设分子=x,分母=y;要求的是这式子mod40009的结果...a[i]范围是1<=a[i]<=500,1<=n<=80;数据太大不能硬来,先用了个数组f[k](k<=40000)存阶乘k!mod40009的值.然后式子可以写成(x%40009)*(1/y%40009)%40009; x%40009即f[x];(1/y%40009)用扩展欧几里德.即(y/1)*(y)=1mod40009,而y%40009很容易得到,逆元y/1%40009也很容易得到...主要就是这么做了,就是不知道为什么一直错.

6.1

Problem 1200 - How Many connected components 找有一个图中有多少个连通子图....题目意思没写清楚,应该说明一下,最大连通子图的个数..这样我就不会WA那么多次了....AC后发现,例如6个顶点,只给两个边1->2,2->3,那么正确答案应该是4,也就是说剩余3个顶点4 5 6,没有提到,但是每个点都算了一个子图..本来我是一直把多余的点算一个子图的.一直WA...题目不难,很容易搞定.

Problem 1022 - Competition of Programming 贪心. 结构体排序, 按惩罚从大到小排序,如果相等按时间从大到小排序.WA了一下午终于AC了.

Problem 1099 - flirly   数论,求幂模..原来做的时候把公式推错了...汗~~再一看,发现原来公式有问题,改了一下就AC了..

Problem 1149 -Motorcar 应该属于数学问题吧..题目描述好模糊,看懂就花了蛮长时间...分析清楚了过程就可以得出结果了,式子蛮简单的,得到这式子得要推下...

今天做的除1200外全是以前做了没对的题目...

5.31

Problem 1039 - Key 我水过的..准确的做法是并查集,我不会用....我AC前TLE,然后我改了一个式子结果就以240+ms过了..可见OJ数据里面的输入有很多是重复数字..如4 4 4 4 4 4 4 4... 我的做法是设了个指向下一个空位置的数组next[],然后再按题目所述的做.

5.29

Problem 1092 - Pure numbers 数论题~以前暴力法做过一次,TLE后就没做了,今天复习EDA无聊时想到这题,想了下用筛选法来做这个题.由于sqrt(5000000)<2250,所以我用一个数组存小于2250的素数.后面的就用筛选法得到5000000以内的素数..再定义一个数组a[5000000]判断是否为pure number.0就是的,1不是.等找到所有的素数后,然后判断小于2250的素数的q次方是不是小于5000000,如果是,那么a[]=0,就这样,然后定义一个purenum[400000]的数组,扫描数组a,如果为0,那么purenum[k++]=a[i];就可以得到结果..我提交的时候RE了好几次,检查了好几次发现是中间变量时出现了问题,把那个变量改为long long 后AC了.

5.25

Problem 1065 - 2D Path Problem 这题有思路了就非常简单,没思路可能就无法可做了.数学问题.把要求的面积表示为一个大三角形减去下面空白空格的面积,这样题目就变得很简单了..

Problem 1290 - Exchange 这道题算法显然是nlogn(n<10000),要不然就会超时.要求交换的次数,应该只有两种办法可求吧...一种是冒泡,一种是归并,前面一种复杂度为n^2,肯定会超时.所以用后者..

5.24

Problem 1094 - Special Graph 给你一个如定义所示的图,(n<=1000000)输入数据n找它的生成树的个数的位数..因为生成树的个数非常的巨大,连位数也相当的大41W位..所叫你求位数..这个题,我试了2,3,4的情况,发现了规律,竟然是Fibonacci数列的偶项数.即f(2*n)的位数,我一开始用数组来做,采取f(n)>99999999的时候向右移一位f(n)=f(n)/10,同时位数count++,如此同上,但是提交后一直错..我一直在提高精度,还是WA..我又想到的采取log10函数求位数,不过这样的话F(n)已经超过double精度了.无法求..后来才知道可以把公式后面省略,然后对前面log10求,结果AC了...AC后我测我原来程序和正确程序的误差,测了快100个数据了还是一样..算了,还是懒得测了,我找不到误差出在哪..n=1000000.数据答案是417975位,即f(2000000)有417975位数,相当大.....

看到ACRush这个题代码,做法和我原来的一样,不过人家高明之处就在把数组用double来表示,这样精度一下子可以提高10几位..

5.23

Problem 1048 - Relationship      几何题,给两个圆的圆心坐标和圆半径,判断两圆是否有交点,如果有那么有几个交点就输出几个交点坐标..本来以为这是个初中水平的数学题,我就是按初中水平来做的..在计算几何里面应该有更好的解法,但是我不知道,只好用初中的方法做.我解二元二次方程,求两点坐标,讨论x1=x2?和y1=y2?和x1!=x2&&y1!=y2,分三种情况来求坐标的,由于式子太多,变量太复杂,所以在中间用些变量来代替一些复杂的常数式子..然后即可得到结果.两圆没交点的条件是|r1-r2|>sqrt(pow(x1-x2,2)+pow(y1-y2,2))或者|r1+r2|<sqrt(pow(x1-x2,2)+pow(y1-y2,2));有一个交点的条件是|r1+r2|==sqrt(pow(x1-x2,2)+pow(y1-y2,2))或者|r1-r2|==sqrt(pow(x1-x2,2)+pow(y1-y2,2)),有两个交点是|r1+r2|>sqrt(pow(x1-x2,2)+pow(y1-y2,2));

Problem 1128 - Matrix 利用求和矩阵求A+A^2+A^3+.....+A^k..(k<=10^7);二分法.

5.22

Problem 1292 - 可怜的地鼠 这题OJ数据不全面,被我用贪心水过了.实际上行不通,我做的时候就已经想到了,不过还是抱着水题的想法写完了,结果AC....我测了一个反例,input:
> 2 2 5 2
> 1.0 1.0
> 19.0 1.0
> 11.0 1.0
> 1 11.0

output 正确的应该是0,我的程序得到的结果是1.
向 汇报OJ数据BUG,说了一下我做这题的情况和我算法的BUG,建议加强数据.得到的回复是:

你好!
你说的没错,这题的数据的确是比较水,在征得董老师同意后会有所修改。
谢谢!

5.21

Problem 1138 - Gauss Fibonacci     用矩阵来做.数据非常大,范围都是10E,相乘就超过32位了,要用64位数据类型....这题如果知道Fibonacci 矩阵的概念和求和矩阵就可以做出来,不知道的就搞不出来..   第1,2,3,4,5项数列为1,1,2,3,5 二维矩阵第一项如下:右上角代表数列第一项,f(1)={0 1; 1 1};(矩阵写的不方便,数列第n项即为f(n)=f(1)^n的右上角元素,还有性质,Fibonacci第n+m项的元素为f(n+m)=f(n)*f(m)的右上角元素.然后题要求的式子就可以分解为f(b)(1+f(k)+f(2k)+f(3k)+...+f((n-1)k))的右上角元素,(每步运算都要求模)化简一下可以得到f(b)(1+f(k)^1+f(k)^2+f(k)^3+...+f(k)^(n-1)),显然f(b),f(k)利用矩阵乘积都可以求出来的..主要是括号里面的和.这个求和又涉及一个矩阵,令A=f(k);A是一个二维矩阵.那么矩阵B={A,I;0,I} 是个4维矩阵,I代表单位矩阵,B^n右上角的二维矩阵即为1+ A+A^2+...+A^(n-1);然后取出二维矩阵和f(b)相乘即可得到结果..由于数据太大了,一般的乘法绝对会超时,所以要用二分法来求f(b),f(k)和B^n.这样的算法复杂度就是logb+logk+logn了,显然不会超时,我AC时是4ms..二分求矩阵的n次幂把我弄的头昏脑涨,搞了一上午,调试了一半天,都有问题,下午去上计算方法时就在写这个二分矩阵乘法,写的差不多了,回来又出现了许多小问题,修改后交上去就AC了,代码写的太乱了,用了好多辅助二维数组,求矩阵时怕弄错,不敢用循环,代码显得很庸肿,后来改了下,却仅仅是长度的减小,时间还增加了.........

Problem 1259 - Tian Ji -- The Horse Racing 贪心.找田忌有多少匹马的速度大于king's

5.20

Problem 1038 - Help!找最小生成树,用double类型,如果最小长度>给的长度就 Poor magicpig! else就Success!

Problem 1088 - 从1开始的N个连续自然数的M次方之和 编程求出1^M+2^M+3^M+...+N^M的近似值,保留3位有效数字。(1<=N<=10000000,1<=M<=20) ..要按标准样例输出,即要提出所得结果的幂数.这个题最早做ACM题就注意到了,当时知道一个近似求值公式,提交上去结果错了,后来又陆续的改啊改,又一直错..今天无意看了下以前写的程序,把公式改了一下,再提交竟然AC了..哈哈,RP问题,别人貌似全部使用DP做的...正好我的总提交数是1088次与题目序号数一样..1088.要你发发...

5.18

Problem 1021 -Bob’s Problem (Special Judged) 贪心,输入n,m,的代表矩阵行和列.矩阵元素由0和1组成.然后输入n个数a[i]代表第i行有多少个1,输入m个数b[i]代表第j行有多少个1,然后输出符合条件的一个矩阵.先从第0行开始直到最后一行,while(a[i]--) 找b[j]中最大的数,填1,b[j]--;为了避免重复找到最大的b[i],设置一个标志数组表示b[i]已经找过了..然后可以得到一个符合条件的矩阵.

Problem 1009 - The Legend of Valiant Emigration其实就是用floyd求图中起点到终点的最短长度的路径..先要把不符合条件的边筛掉..

5.16~17

Problem 1087 - 数星星   给N个点坐标,判断最多有多少个点有同一条直线上..两对两对的判断斜率,斜率相等就在同一条直线上..我数学落后,我先两两判断两点的横坐标是否相等,再判断两对两对间的斜率..AC后跑了604ms,看别人代码,不用这样...直接用(y3-y2)*(x2-x1)-(x3-x2)*(y2-y1)==0来判断.再AC,232ms..省去不了少时间.

Problem 1140 - Searching   问mmd大牛,精度的控制..他把OJ数据发我了...发现k=0.99999999的数据时,我的程序死活过不了..其他的都能过.汗,水之~~恶心的精度题.....

Problem 1225 - Catch That Cow BFS做的..虽然代码写的很挫..~~运行时间排在最后..3s+,不过好歹也是自己花半小时弄出来的~~TLE了好几次,剪枝N次...最后一次是把负数剪了才过的...看别人的代码,汗~~真是惭愧....

Problem 1274 - Sum of Different Primes 先求出1120以内的素数,然后把所有的情况记录下来,直接过.

Problem 1329 -Where's Waldorf? 直接硬搞的,考虑8个方向..

Problem 1332 - Automated Judge Script模拟~~

5.14~15

Problem 1316 - 负权数 数论中的进制问题..先当作正权数来求出对应位的数,然后推出负权数的各位.

Problem 1079 -Fractions数论.我的做法是用法雷数列来找,碾转找,直到分母>c..第一次AC用时137ms,很有效率.该题超时2次,错4次.第一次就按一般的找..超时了,第二次用了欧几里德算法约分,并考虑了一下b<=c的情况,超时了..然后想了下哪儿可以优化一下,没想到,试了一下a=1,b=1000000000,c=900000000的情况,果然等了大约5秒才出现结果,而题目要求的是3s..于是把a=1,当作一个特例来做.提交,WA,214ms..很高兴,因为没超时,说明算法已经对了,然后又考虑是不是精度问题,把double又全部换成long double了.又WA,接着继续WA了三次...估计不是精度问题吧..没办法只好自己乱按些数据测,终于发现a=1,b为偶数的情况,c<b时我的有错误,a=1,b=40,c=20时,正确的应该是输出0 1,我的却是1 20,改了后提交就AC了..happy~~然后又把自己程序改了下,因为一直在修改,到处都是//或者/* 注释符,太乱了.修改后,确定了应该使用double类型,精确到小数点后13位,也就是1e-13才对,或者精确度更高也行.

5.11

Problem 1355 - Stand in a line 校赛题目.链表做的.感觉现在链表差不多用熟了.第一次AC时内存使用过大,用free()修改了两次后,内存减少了三倍,看来使用链表还是得有借有还啊..

Problem 1019 - Curriculum Schedule这题要不是今天lx错N次后AC的话,我到现在还找不出我的错误.之前我把这个题WA了两个版面后,都对这题失望了........其实就是把scanf("%d",,,),getchar()改为scanf("%d\n"...)后就能AC了..但是不知道两者有什么区别.

5.10

Problem 1005 - Holding Animals DP 0-1背包.

Problem 1006 - Language of Animals链表+BFS,由于对链表操作不熟,写了大约两个多小时才搞定.

     Problem 1016 - Cherry Blossom   先找中间纵坐标,然后直接穷举找,做的时候没考虑坐标为负数,结果WA了好多次....

    Problem 1018 - King Kong   置换群..看了下flymouse的博客对其介绍后搞定的.

   Problem 1026 - Game On Checkerboard    DP,

Problem 1041 - MagicForest   BFS.

Problem 1151 - Context-Free Clock   数学问题,00:00:00~~23:59:59 共86400个值,每个值对应一个角度,精度太让人郁闷..为了避免用double,我都用long 替换了,还是WA了几次才AC..

Problem 1347 - Frog 今年校赛题,DP..

Problem 1204 - 继续找相同   跟1203题差不多,以前做一直超时.现在知道了两种方法..一种跟1203差不多.另外一种是随机概率法..方法很牛,不怎么会用.原以为用STL中nth_element可以过,结果可以过1203,不能过1204,然后1204WA了一下午..

Problem 1227 - Cow Solitaire正确应该用DP做..我一看数据不大,直接DFS,结果用时比用DP的还少..^-^

Problem 1167 - Oil Detecting 非连通图中判断有几个连通子图..DFS

Problem 1379 - DNA matching 字符串题,简单,但不知道我为什么一直WA.

Problem 1374 - Rabbit 推出一个公式然后用高精度加法.

Problem 1211 - 表达式的值 数据结构书上有..

Problem 1254 - The Counting Problem 我用递归做的.

Problem 1264 - Calendar 日历,直接搞,判断闰年,

Problem 1116 - Lenny's Lucky Lotto ListsDP吧.

Problem 1107 -DNA也是DP

Problem 1209 - Sherlock's Expression欧几里德算法

Problem 1302 - Raising Modulo Numbers 数论,求模的和.0的情况要注意

Problem 1207 - Feli的糖果3 找比输入数大的最小回文数..进位情况要注意.

Problem 1141 - Encoded Love-letter 数组下标(字符-'0')存来看是否重复.

Problem 1345 - Join TogetherCatalan数,高精度乘法,用JAVA的人时间比我还快~--!!

Problem 1268 - Game of Connections 同上,一模一样

Problem 1283 - Matrix Chain Multiplication 栈的使用.括号配对

Problem 1043 - Magicstar 硬搞的.

Problem 1126 - Sequence Again DP+数论中的欧拉公式

Problem 1171 - Recursive Function 求递归方程,DP备忘录

Problem 1185 - Apples 整数划分,有递归公式.我用DP.同上

Problem 1073 - Coins称硬币,经典问题,公式我记住了,原理不太明白.

Problem 1168 - Mining扫雷游戏, 思路清晰了就写代码,没什么算法.

Problem 1186 - Consecutive-digit Number   就是看一个大数,是否数字都是连续的,90123.8901也是的,0的情况特殊.

Problem 1330 - Common Permutation 题目描述要求数据大小是1000,结果做了后发现大家用的时间都这么少,就去测服务器OJ上的测试数组大小,结果测后,数组范围大小为2就可以过,ft~~.不过数据还是有多种case.不像某个题别人在Discuss里面写到Just print 3!.......-_-!!

老早以前的懒得写了,全为WOJ acm.whu.edu.cn/oak/上的.以后做了再慢慢加..

由于错误的以为选拔赛取两场成绩,我最后一场比赛没做,未能进集训队,以后肯定做得比较少,帐号也就没啥作用了,空着还不如公开,大家共享使用吧.(见OJ资料)~~希望对在WOJ上做题的人有些帮助.