03 2010 档案

摘要:思路:用qsort对字符串数组进行排序,由于父串与子串相邻,则只要比较相邻串是否符合就行了(通过比较相邻字符串长度,选择长度小的作为判断长度)这次掌握了对字符串数组的快排;不过还有人用trie树来做的,目前还不会。用到的部分代码:qsort(num,n,sizeof(num[0]),cmp);for(i=0;i<n;i++) len[i]=strlen(num[i]);for(i=0;i<n-1;i++){ length=len[i]<len[i+1]?len[i]:len[i+1]; ok=0; for(k=0;k<length;k++) if(num[i][k]!= 阅读全文
posted @ 2010-03-31 21:22 SubmarineX 阅读(284) 评论(0) 推荐(0)
摘要:显然是位操作题做得有点没效率考虑三种情况:从低位读起,第一个读到的1后是0(例*0010*,则处理后为*0100*)从低位读起,读到一串1,分两种情况,a。最低位为1(例*0111,处理后为*1011);b。最低位为0(例*001110,处理后为*010011)#include<stdio.h>#include<string.h>int main(){ int i,t; long n,temp,bite[25],num[25]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,13 阅读全文
posted @ 2010-03-27 22:43 SubmarineX 阅读(263) 评论(0) 推荐(0)
摘要:起先还以为照着题目写下递归就好了,可是运行到50 50 50时,怎么也出不了答案,寒,原来要用记忆化搜索,这样可以省去重复操作。#include<stdio.h>long num[21][21][21]={0};long w(int a,int b,int c){ if(a<=0 || b<=0 || c<=0) return 1; if(a>20 || b>20 || c>20) return w(20,20,20); if(num[a][b][c]) return num[a][b][c]; if(a<b && b< 阅读全文
posted @ 2010-03-24 20:39 SubmarineX 阅读(256) 评论(0) 推荐(0)
摘要:给你二个整数p和a,其中p是质数。求ap除以p后的余数。输入: 每一行包含a和p,p=0时结束输入,最后一行输入不处理。输出: 每一行输出所求的值。例子:In: 2 22 31 0Out:02Hint: 1 0时,因为p = 0, 结束输入。Source:WT用到费马小定理。若p为质数,则ap% p =a% p,a<0时,ap% p =a% p +p,(若(-a)%p==0),则ap% p = 0 )#include<stdio.h>int main(){int a,p;while(scanf("%d%d",&a,&p)!=EOF,p)a& 阅读全文
posted @ 2010-03-14 14:06 SubmarineX 阅读(228) 评论(0) 推荐(0)
摘要:终于做出来了,不禁长舒一口气。历时+-8小时,倍感压力巨大。接下来说说我的心得吧:这题用到的是组合的知识;处理第一位字母时,需要计算之前的字母排序数,第一位有其特殊之处:如:bcd,处理b位时,前面有 口??,和a??两种情况,我们只要处理2次就可以了;处理末位时,只要计算(当前位字母-前一位字母)即可;处理首末之间位置时,就要考虑两种情况:比如bexy,处理e位时,1.口??,这一种对于每一位计算都需要;2. c??、d??,而这一种,就要看前一位和当前位了,之间有几个字母,就有几个排序。对于排序,这样计算Cmn(该符号为组合数表示),n是 26-当前位字母序数(在字母表中的序数),m是 l 阅读全文
posted @ 2010-03-11 19:35 SubmarineX 阅读(174) 评论(0) 推荐(0)
摘要:题目:一共有10位数,当且只有最后一位若等于10的话,用X表示(当然输入输出都需要考虑 是否是 ‘X’)For example 0201103311 is a valid ISBN, since 10*0 + 9*2 + 8*0 + 7*1 + 6*1 + 5*0 + 4*3 + 3*3 + 2*1 + 1*1 = 55. 找出带‘?’的那位上的数值,并输出,若不能找到,则输出‘-1’。如果还是WA的花,不妨测下下面的测试数据(很强悍的):156881111X?56881111X 1?6881111X 15?881111X 156?81111X 1568?1111X 15688?111X 15 阅读全文
posted @ 2010-03-09 19:43 SubmarineX 阅读(421) 评论(0) 推荐(0)
摘要:骑车去学校,题目意思:从A地开始,当刚到A地时,如果有车就跟着出发,不然就等车来,再跟着。如果途中有比当前行驶速度大的车,就跟着那辆。求到B的时间。思路:如果Ti为负,则说明,在主人公到A地前|Ti|s已经经过A地,如果能被主人公赶上,则 i 的速度不及主人公的速度,还有一种情况是主人公一直都没追上。所以这种数据可以忽略。接下来就是Ti>=0的了,我们可以这样想:如果如果主人公刚开始搭a车.b车.c.d.,最后搭上的那辆车肯定是该车全程用时最少的,那我们就可以做了,全程时间=全程距离/速度+Ti;比较一下,谁用时最少就可以了。 阅读全文
posted @ 2010-03-09 16:38 SubmarineX 阅读(317) 评论(0) 推荐(0)
摘要:自己画图,根据m和n的奇偶性来做:至少有一个为even,则((m-1)+(n-1))*2+(m-2)*(n-2),即m*n。若都为odd,则((m-1)+(n-1))*2+(m-3)*(n-2)+(n-3)+sqrt(2),即m*n-1+sqrt(2),简写成m*n+0.41。 阅读全文
posted @ 2010-03-07 14:41 SubmarineX 阅读(257) 评论(0) 推荐(0)
摘要:对int数组排序: #include #include int cmp(const void *a, const void *b) //int 是作为返回值类型,返回值为真或假,故用int(包括数据double时) { return(*(int *)a-*(int *)b); //如果是double型数组,则int改为double就可以了 } int... 阅读全文
posted @ 2010-03-03 17:56 SubmarineX 阅读(280) 评论(0) 推荐(0)
摘要:注意这句话:OutputFor each test case, print the grade on a separate line (without unnecessary decimal points and/or zeros.)小数部分为0,则不用小数点,小数部分的后导0舍去。所以用%g可以达到这个目的。格式字符:g,G选用%g或%G格式中输出宽度较短的一种格式,不输出无意义的0.用G时,若以指数形式输出,则指数以大写表示。 阅读全文
posted @ 2010-03-02 20:27 SubmarineX 阅读(440) 评论(0) 推荐(0)
摘要:思想是这样的:比如求100,000以内素数个数,定义一个bool型变量(c里不能定义bool型),bool prime[100001](长度比10,000大1);当i%2==1时,prime[i]=true;否则,prime[i]=false;i=3,j=2*i,对下标为3的倍数的prime[j]赋false;i自增,重复第3步;total=0;if(prime[i]) total++。[代码] 阅读全文
posted @ 2010-03-02 19:30 SubmarineX 阅读(180) 评论(0) 推荐(0)
摘要:求和公式:(i+(i+m-1))*m=2*n,即:(2*i+m-1)*m=2*n,i为首项,m为项数,n为测试数。由公式可以分析出:2*n%m==0;(2*n/m+1-m)%2==0;∵2*i+m-1>m,∴m2<2*n。根据以上几点,就可以编了。 阅读全文
posted @ 2010-03-01 12:53 SubmarineX 阅读(201) 评论(0) 推荐(0)