acm 接下来最近一年又一期的哪一年里的同一个日子,和今天的星期数一样

Zeller公式——一条公式算出某天是星期几
历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如日要看作2002年的13月1日来计算);d:日;[
]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和&14月来算,这时C和y均按上一年取值。)
算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
以日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:
蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2&20+[26& (10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即日(100周年国庆)是星期5。
你的生日(出生时、今年、明年)是星期几?不妨试一试。
不过,以上公式只适合于日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
过程的推导:(对推理不感兴趣的可略过不看)
星期制度是一种有古老传统的制度。据说因为《圣经·创世纪》中规定上帝用了六&
天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生&
活,而星期日是休息日。从实际的角度来讲,以七天为一个周期,长短也比较合适。所&
以尽管中国的传统工作周期是十天(比如王勃《滕王阁序》中说的“十旬休暇”,即是&
指官员的工作每十日为一个周期,第十日休假),但后来也采取了西方的星期制度。&
  在日常生活中,我们常常遇到要知道某一天是星期几的问题。有时候,我们还想知&
道历史上某一天是星期几。通常,解决这个方法的有效办法是看日历,但是我们总不会&
随时随身带着日历,更不可能随时随身带着几千年的万年历。假如是想在计算机编程中&
计算某一天是星期几,预先把一本万年历存进去就更不现实了。这时候是不是有办法通&
过什么公式,从年月日推出这一天是星期几呢?&
  答案是肯定的。其实我们也常常在这样做。我们先举一个简单的例子。比如,知道&
了日是星期六,那么日“世界无烟日”是星期几就不难推算出&
来。我们可以掰着指头从1日数到31日,同时数星期,最后可以数出5月31日是星期一。&
其实运用数学计算,可以不用掰指头。我们知道星期是七天一轮回的,所以5月1日是星&
期六,七天之后的5月8日也是星期六。在日期上,8-1=7,正是7的倍数。同样,5月15&
日、5月22日和5月29日也是星期六,它们的日期和5月1日的差值分别是14、21和28,也&
都是7的倍数。那么5月31日呢?31-1=30,虽然不是7的倍数,但是31除以7,余数为2,&
这就是说,5月31日的星期,是在5月1日的星期之后两天。星期六之后两天正是星期一。&
  这个简单的计算告诉我们计算星期的一个基本思路:首先,先要知道在想算的日子&
之前的一个确定的日子是星期几,拿这一天做为推算的标准,也就是相当于一个计算的&
“原点”。其次,知道想算的日子和这个确定的日子之间相差多少天,用7除这个日期&
的差值,余数就表示想算的日子的星期在确定的日子的星期之后多少天。如果余数是&
0,就表示这两天的星期相同。显然,如果把这个作为“原点”的日子选为星期日,那&
么余数正好就等于星期几,这样计算就更方便了。&
  但是直接计算两天之间的天数,还是不免繁琐。比如日和2004年5月&
1日之间相隔7947天,就不是一下子能算出来的。它包括三段时间:一,&
日以后这一年的剩余天数;二,这二十一个整年的全部天数;三,从2004年&
元旦到5月1日经过的天数。第二段比较好算,它等于21*365+5=7670天,之所以要加&
5,是因为这段时间内有5个闰年。第一段和第三段就比较麻烦了,比如第三段,需要把&
5月之前的四个月的天数累加起来,再加上日期值,即31+29+31+30+1=122天。同理,第&
一段需要把7月之后的五个月的天数累加起来,再加上7月剩下的天数,一共是155天。&
所以总共的相隔天数是122+7天。&
  仔细想想,如果把“原点”日子的日期选为12月31日,那么第一段时间也就是一个&
整年,这样一来,第一段时间和第二段时间就可以合并计算,整年的总数正好相当于两&
个日子的年份差值减一。如果进一步把“原点”日子选为公元前1年12月31日(或者天文&
学家所使用的公元0年12月31日),这个整年的总数就正好是想算的日子的年份减一。这&
样简化之后,就只须计算两段时间:一,这么多整年的总天数;二,想算的日子是这一&
年的第几天。巧的是,按照公历的年月设置,这样反推回去,公元前1年12月31日正好是&
星期日,也就是说,这样算出来的总天数除以7的余数正好是星期几。那么现在的问题就&
只有一个:这么多整年里面有多少闰年。这就需要了解公历的置闰规则了。&
  我们知道,公历的平年是365天,闰年是366天。置闰的方法是能被4整除的年份在&
2月加一天,但能被100整除的不闰,能被400整除的又闰。因此,像、2400&
年都是闰年,而、年都是平年。公元前1年,按公历也是闰年。&
  因此,对于从公元前1年(或公元0年)12月31日到某一日子的年份Y之间的所有整年&
中的闰年数,就等于&
[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400],&
[...]表示只取整数部分。第一项表示需要加上被4整除的年份数,第二项表示需要去掉&
被100整除的年份数,第三项表示需要再加上被400整除的年份数。之所以Y要减一,这&
样,我们就得到了第一个计算某一天是星期几的公式:&
W&=&(Y-1)*365&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]&+&D.&&&&&&&&&&&&&&(1)&
其中D是这个日子在这一年中的累积天数。算出来的W就是公元前1年(或公元0年)12月&
31日到这一天之间的间隔日数。把W用7除,余数是几,这一天就是星期几。比如我们来&
W&=&(5&+&[(]&-&[(0]&+&[(0]&+&
&&&(31+29+31+30+1)&
&&=&731702,&
731702&/&7&=&104528……6,余数为六,说明这一天是星期六。这和事实是符合的。&
  上面的公式(1)虽然很准确,但是计算出来的数字太大了,使用起来很不方便。仔&
细想想,其实这个间隔天数W的用数仅仅是为了得到它除以7之后的余数。这启发我们是&
不是可以简化这个W值,只要找一个和它余数相同的较小的数来代替,用数论上的术语&
来说,就是找一个和它同余的较小的正整数,照样可以计算出准确的星期数。&
  显然,W这么大的原因是因为公式中的第一项(Y-1)*365太大了。其实,&
(Y-1)*365&=&(Y-1)&*&(364+1)&
&&&&&&&&&&=&(Y-1)&*&(7*52+1)&
&&&&&&&&&&=&52&*&(Y-1)&*&7&+&(Y-1),&
这个结果的第一项是一个7的倍数,除以7余数为0,因此(Y-1)*365除以7的余数其实就&
等于Y-1除以7的余数。这个关系可以表示为:&
(Y-1)*365&≡&Y-1&(mod&7).&
其中,≡是数论中表示同余的符号,mod&7的意思是指在用7作模数(也就是除数)的情&
况下≡号两边的数是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,这样我们就得到&
了那个著名的、也是最常见到的计算星期几的公式:&
W&=&(Y-1)&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]&+&D.&&&&&&&&&&&&&&&&&&(2)&
  这个公式虽然好用多了,但还不是最好用的公式,因为累积天数D的计算也比较麻&
烦。是不是可以用月份数和日期直接计算呢?答案也是肯定的。我们不妨来观察一下各&
个月的日数,列表如下:&
月  份:1月 2月  3月 4月 5月 6月 7月 8月 9月 10月 11月 12月&
--------------------------------------------------------------------------&
天  数:&31&&28(29)&&31&&&30&&&31&&&30&&&31&&&31&&&30&&&31&&&&30&&&&31&
如果把这个天数都减去28(=4*7),不影响W除以7的余数值。这样我们就得到另一张&
月  份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月&
------------------------------------------------------------------------&
剩余天数:&3&&&0(1)&&3&&&&2&&&&3&&&&2&&&&3&&&&3&&&&2&&&&3&&&&&2&&&&&3&
平年累积:&3&&&3&&&&&6&&&&8&&&11&&&13&&&16&&&19&&&21&&&24&&&&26&&&&29&
闰年累积:&3&&&4&&&&&7&&&&9&&&12&&&14&&&17&&&20&&&22&&&25&&&&27&&&&30&
仔细观察的话,我们会发现除去1月和2月,3月到7月这五个月的剩余天数值是3,2,3,2,&
3;8月到12月这五个月的天数值也是3,2,3,2,3,正好是一个重复。相应的累积天数中,&
后一月的累积天数和前一月的累积天数之差减去28就是这个重复。正是因为这种规律的&
存在,平年和闰年的累积天数可以用数学公式很方便地表达:&
&&&&╭&d;               & (当M=1)&
D&=&{&&31&+&d;         &&&&  &&(当M=2)&         &(3)&
&&&&╰&[&13&*&(M+1)&/&5&]&-&7&+&(M-1)&*&28&+&d&+&i. &(当M≥3)&
其中[...]仍表示只取整数部分;M和d分别是想算的日子的月份和日数;平年i=0,闰年&
i=1。对于M≥3的表达式需要说明一下:[13*(M+1)/5]-7算出来的就是上面第二个表中的&
平年累积值,再加上(M-1)*28就是想算的日子的月份之前的所有月份的总天数。这是一&
个很巧妙的办法,利用取整运算来实现3,2,3,2,3的循环。比如,对日,有:&
D&=&[&13&*&(5+1)&/&5&]&-&7&+&(5-1)&*&28&+&1&+&1&
&&=&122,&
这正是5月1日在2004年的累积天数。&
  假如,我们再变通一下,把1月和2月当成是上一年的“13月”和“14月”,不仅仍&
然符合这个公式,而且因为这样一来,闰日成了上一“年”(一共有14个月)的最后一&
天,成了d的一部分,于是平闰年的影响也去掉了,公式就简化成:&
D&=&[&13&*&(M+1)&/&5&]&-&7&+&(M-1)&*&28&+&d.&&&&&&&&(3≤M≤14)&&&&&&&&(4)&
上面计算星期几的公式,也就可以进一步简化成:&
W&=&(Y-1)&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]&+&[&13&*&(M+1)&/&5&]&-&7&
&&&+&(M-1)&*&28&+&d.&
因为其中的-7和(M-1)*28两项都可以被7整除,所以去掉这两项,W除以7的余数不变,&
公式变成:&
W&=&(Y-1)&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]&+&[&13&*&(M+1)&/&5&]&+&d.&
                                    (5)&
当然,要注意1月和2月已经被当成了上一年的13月和14月,因此在计算1月和2月的日子&
的星期时,除了M要按13或14算,年份Y也要减一。比如,日是星期四,用这&
个公式来算,有:&
W&=&(2003-1)&+&[(]&-&[(0]&+&[(0]&+&[13*(13+1)/5]&
&&=&2002&+&500&-&20&+&5&+&36&+&1&
&&=&2524;&
2524&/&7&=&360……4.这和实际是一致的。&
  公式(5)已经是从年、月、日来算星期几的公式了,但它还不是最简练的,对于年&
份的处理还有改进的方法。我们先来用这个公式算出每个世纪第一年3月1日的星期,列&
年份:&&1(401,801,…,2001)&&&&&&&&&&&&&&&&&&&101(501,901,…,2101)&
--------------------------------------------------------------------&
星期: 4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2&
====================================================================&
年份:201(601,1001,…,2201)&&&&&&&&&&&&&&&&&&301(701,1101,…,2301)&
--------------------------------------------------------------------&
星期:&&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&5&
可以看出,每隔四个世纪,这个星期就重复一次。假如我们把301(701,1101,…,2301)&
年3月1日的星期数看成是-2(按数论中对余数的定义,-2和5除以7的余数相同,所以可&
以做这样的变换),那么这个重复序列正好就是一个4,2,0,-2的等差数列。据此,我们&
可以得到下面的计算每个世纪第一年3月1日的星期的公式:&
W&=&(4&-&C&mod&4)&*&2&-&4.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(6)&
式中,C是该世纪的世纪数减一,mod表示取模运算,即求余数。比如,对于2001年3月&
1日,C=20,则:&
W&=&(4&-&20&mod&4)&*&2&-&4&
&&=&8&-&4&
  把公式(6)代入公式(5),经过变换,可得:&
(Y-1)&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]&≡&(4&-&C&mod&4)&*&2&-&1&
(mod&7).&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(7)&
因此,公式(5)中的(Y-1)&+&[(Y-1)/4]&-&[(Y-1)/100]&+&[(Y-1)/400]这四项,在计算&
每个世纪第一年的日期的星期时,可以用(4&-&C&mod&4)&*&2&-&1来代替。这个公式写&
出来就是:&
W&=&(4&-&C&mod&4)&*&2&-&1&+&[13&*&(M+1)&/&5]&+&d.&&&&&&&&&&&&&&&&&&&&&&&(8)&
有了计算每个世纪第一年的日期星期的公式,计算这个世纪其他各年的日期星期的公式&
就很容易得到了。因为在一个世纪里,末尾为00的年份是最后一年,因此就用不着再考&
虑“一百年不闰,四百年又闰”的规则,只须考虑“四年一闰”的规则。仿照由公式(1)&
简化为公式(2)的方法,我们很容易就可以从式(8)得到一个比公式(5)更简单的计算任意&
一天是星期几的公式:&
W&=&(4&-&C&mod&4)&*&2&-&1&+&(y-1)&+&[y/4]&+&[13&*&(M+1)&/&5]&+&d.&&&&&&&(9)&
式中,y是年份的后两位数字。&
  如果再考虑到取模运算不是四则运算,我们还可以把(4&-&C&mod&4)&*&2进一步改写&
成只含四则运算的表达式。因为世纪数减一C除以4的商数q和余数r之间有如下关系:&
4q&+&r&=&C,&
其中r即是&C&mod&4,因此,有:&
r&=&C&-&4q&
&&=&C&-&4&*&[C/4].&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(10)&
(4&-&C&mod&4)&*&2&=&(4&-&C&+&4&*&[C/4])&*&2&
&&&&&&&&&&&&&&&&&&=&8&-&2C&+&8&*&[C/4]&
&&&&&&&&&&&&&&&&&&≡&[C/4]&-&2C&+&1&(mod&7).&&&&&&&&&&&&&&&&&&&&&&&&&&&(11)&
把式(11)代入(9),得到:&
W&=&[C/4]&-&2C&+&y&+&[y/4]&+&[13&*&(M+1)&/&5]&+&d&-&1.&&&&&&&&&&&&&&&&&(12)&
这个公式由世纪数减一、年份末两位、月份和日数即可算出W,再除以7,得到的余数是&
几就表示这一天是星期几,唯一需要变通的是要把1月和2月当成上一年的13月和14月,&
C和y都按上一年的年份取值。因此,人们普遍认为这是计算任意一天是星期几的最好的&
公式。这个公式最早是由德国数学家克里斯蒂安·蔡勒(Christian&Zeller,&1822-&
1899)在1886年推导出的,因此通称为蔡勒公式(Zeller’s&Formula)。为方便口算,&
式中的[13&*&(M+1)&/&5]也往往写成[26&*&(M+1)&/&10]。&
  现在仍然让我们来算日的星期,显然C=20,y=4,M=5,d=1,代入蔡勒&
公式,有:&
W&=&[20/4]&-&40&+&4&+&1&+&[13&*&(5+1)&/&5]&+&1&-&1&
&&=&-15.&
注意负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便&
计算,我们可以给它加上一个7的整数倍,使它变为一个正数,比如加上70,得到55。&
再除以7,余6,说明这一天是星期六。这和实际是一致的,也和公式(2)计算所得的结&
  最后需要说明的是,上面的公式都是基于公历(格里高利历)的置闰规则来考虑&
的。对于儒略历,蔡勒也推出了相应的公式是:&
W&=&5&-&C&+&y&+&[y/4]&+&[13&*&(M+1)&/&5]&+&d&-&1.&&&&&&&&&&&&&&&&&&&&&&(13)&
  这样,我们终于一劳永逸地解决了不查日历计算任何一天是星期几的问题。
(以上内容来自网络)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。ACM与我的成长历程
&&& 当我一说起acmer这个词的时候,我想凡是参加过ACM大赛的人,或者是在ACM集训队进行培训的人,都会无比的激动,自豪,骄傲,甚至是感激。因为acm这个比赛让我们收获了太多太多的东西。至少对我来说是这样的,我这四年里,干得最有意义的一件事情,做的最成功的决定就是在大二下学期那年的暑假留在了ACM集训队。或许是从那开始,我的人生开始发生了彻底的改变。&& 已经二年没有编程的我,刚开始参加集训的时候。一个A+B就足足编了一天,有的时候一个程序甚至是二天三天才能攻克,当时很郁闷!对自己的智力产生质疑,从那以后不在有优越感,感觉自己真的是太菜了。当时真想过要放弃,可是我心中有个声音在告诉我,这已经是最后一次奋进的机会了,我已经碌碌无为了两年,我不想毕业以后就失业!对我来说这是一个人生的转折点,这是一次难得的机会。就这样在彷徨与失落中我坚持了下来。&& 在这里我接触到了我们学校的编程高手们,如果有人问:华德编程最猛的人都在哪?那我会毫不犹豫的回答他,你上ACM小组去找去。从他们那里我学到了很多的编程思想,和知识,当然在他们身上我学到最重要的东西就是一种精神,一种永不放弃,顽强拼搏的精神,这里面的每一个人,都一次又一次的挑战自己的极限,不断的超越自我。尤其是我们这里的两位学长,在刚上大四上学期的时候就成功的进入了阿里巴巴和迅雷两家大公司(而且都是与全国一流的大学硕士生进行竞争)。这让我明白了,只要努力,我们华德的学生也一样可以!& &于是乎,大三上学期的时候就开始专攻JAVA,学完了基础以后自己又先后做了两个小项目。来巩固知识,等到这学期的时候我便又回到了ACM,开始尝试着用JAVA去AC题,刚开始很不顺,几乎全都是WA和PE,但是经过自己的不断尝试与失败总结,最后终于也能用Java去AC以前做过的题了。并开始尝试着去做一些新题,当我在去做题的时候发现不像上学期那么吃力了,和以前比思路也变得尤为清晰.尤其是考虑问题和分析问题的能力,较以前要强很多。&&& 接下来就是一系列的没有想到了,没有想到自己会获取参加省赛的资格,更没有想到的是在省赛的时候,我们马上就要放弃的时候,又突然之间AC了两道题,并拿到了三等奖。这一切存在着太多太多不可预知的因素!让我感觉就好像是在做梦一样。省赛参加完了,或许我的ACM生涯也将就些结束了,短短两天的省赛,但是带给我的记忆将会是20年,40年,60年甚至是一辈子。还有这里面的每一位战友们。我们曾经失落过,感动过,开心过,我们都为自己的梦想去努力着,都在这里挥洒着汗水,去书写自己的青春。&& 我会记住这里的每一个人,每一个精彩的瞬间。在这里学习的日子,对我的人生有了莫大的影响和帮助。如果说人生是一幅画,那么在这里的这段时间就是这幅画上最鲜艳的色彩。& 如果没有参加ACM培训我就不会做出努力学好Java这个决定,如果没有参加ACM培训也就没有今天的我!最后附上一篇acm大牛的一篇随笔最后附上一份ACM大牛的ACM随笔
ACM-ICPC比赛随想&&刘汝佳刘汝佳,1982年12月生,毕业于重庆外国语学校,清华大学计算机科学与技术系2005级研究生。高二时创立&信息学初学者之家&网站(OIBH),高三入选IOI2001国家集训队。大学一年级时获ACM/ICPC世界总决赛银牌(世界第四),IOI国家集训队指导老师。曾与黄亮合作出版了《算法艺术与信息学竞赛》丛书,自2002年至今为科学委员会学生委员,在命题方面和辅导学生方面成绩突出,同时兼任NOI网站总监。从第一次听说ACM/ICPC到现在,已经有快七个年头了。最开始因好奇而关注,
分享这篇日志的人也喜欢
刚好你经过?
爱之深切之痛
播个有效天
饱饱的归来
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场acm大赛题库_甜梦文库
acm大赛题库
2010 五月内 科大 acm 题 库 汇 编大数除 2#include&iostream& #include&string.h& char a[50],b[50]; void div2(char a[]){int i,j; int d=0; alen=strlen(a); for(i=0;i&i++) { b[i]=(((a[i]-'0')+d*10)/2)+'0'; d=((a[i]-'0')+d*10)%2; } b[i]='\0'; if(b[0]=='0') { for(j=0;j&i;j++) { b[j]=b[j+1]; } }}int main(){gets(a);div2(a);puts(b); return 0;1 / 140 2010 五月内 科大 acm 题 库 汇 编}大数相加 #include&iostream& #include&string.h& char A[52],B[52]; void add(char a[],char b[]){int i,j,k,up,x,y,z,l; char *c; if(strlen(a)&strlen(b)) l=strlen(a)+2; elsel=strlen(b)+2;c=(char*)malloc(l*sizeof(char)); i=strlen(a)-1; j=strlen(b)-1; k=0; up=0; while(i&=0||j&=0) { if(i&0) x='0'; else x=a[i]; if(j&0) y='0'; else y=b[j]; z=x-'0'+y-'0'; if(up) z=z+1; if(z&9)2 / 140 { up=1;z=z%10; }else up=0; c[k++]=z+'0'; i--; j--; } if(up) c[k++]='1'; i=0; c[k]='\0'; for(k=k-1;k&=0;k--) A[i++]=c[k]; A[i]='\0';}void main(){gets(A);gets(B);add(A,B); puts(A);}大数相减 #include&iostream& #include&string.h& char A[52],B[52];char t[52]; void sub(char a[],char b[]){3 / 140 2010 五月内 科大 acm 题 库 汇 编int i,l1,l2,k; l1=strlen(a);l2=strlen(b);t[l1]='\0'; l1--; for(i=l2-1;i&=0;i--,l1--) { if(a[l1]-b[i]&=0) t[l1]=a[l1]-b[i]+'0'; else { t[l1]=10+a[l1]-b[i]+'0'; a[l1-1]=a[l1-1]-1; } } k=l1; while(a[k]&0) { a[k]=a[k]+10; a[k-1]=a[k-1]-1; k--;}while(l1&=0){t[l1]=a[l1]; l1--;}loop: if(t[0]=='0') { l1=strlen(a); for(i=0;i&l1-1;i++) t[i]=t[i+1];4 / 140 2010 五月内 科大 acm 题 库 汇 编t[l1-1]='\0'; } if(strlen(t)==0) { t[0]='0'; t[1]='\0'; }for(i=0,k=0;k&strlen(t);k++) A[i++]=t[k]; A[i]='\0';}int main(){gets(A);gets(B);sub(A,B); puts(A); return 0;}给 出年,月,日,计 算该 日是该年的第几天(年月计 算)#include&stdio.h&struct data{};int main()5 / 140 2010 五月内 科大 acm 题 库 汇 编{ int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf(&%d-%d-%d&,&d.year,&d.month,&d.day)!=EOF) { da=0; a[1]=28; if((d.year%4==0&&d.year%100!=0)||(d.year%100==0&&d.year%400==0)) a[1]=29; for(int i=0;i&d.month-1;i++) da=da+a[i]; da=da+d. printf(&%d\n&,da); } return 0;}给 出一个正整数,求出它是几位数 ,分别 输出每一位 字,按逆序数 输出各位数字(数 学 问 题 )#include&iostream.h&void main(){ cin&&a; int b=1; long a1=a; while(a1!=a1%10) { a1=int(a1/10); b++; } cout&&&它是一个 &&&b&&&位数。&&& long c=0;6 / 140 2010 五月内 科大 acm 题 库 汇 编long d=1;long e=0;for(int i=0;i&b;i++) { d=d*10; c=(a%d-e)*10/d; e=a%d; cout&&c&& }}求两 个 数 m 和 n 的最大公约 数 和最小公倍数(欧几里德定理) #include&iostream.h&void main(){int m,n; cin&&m&&n; for(int i=n;i&0;i--) { if(m%i==0&&n%i==0) { cout&&&最大公约 数 &&&endl&&i&& }} for(int j=n;;j++) { if(j%m==0&&j%n==0) {cout&&&最小公倍数&&&endl&&j&&7 / 140 2010 五月内 科大 acm 题 库 汇 编}}}输 出 1900 年到 2000 年中是闰 年的年份8 / 140 2010 五月内 科大 acm 题 库 汇 编#include&iostream.h&void main(){for(int i=1900;i&=2000;i++) if(i%4==0&&i%100!=0||i%100==0&&i%400==0) cout&&i&&}万年历 (年月计 算) #include&iostream.h& #include&stdio.h& int getYearWeekDay(int y); int getYearDays(int y); int isLeap(int y); int getMonthWeekDay(int y, int m); int getMonthDays(int y, int m); void printYear(int y); void printMonth(int y, int m);int count=0; int main(){ cout&&&请 输 入一个年份:&&& cin&&y; printYear(y); return 1;}int getYearWeekDay(int y)//计 算 y 年的第一天是星期几,以 2000 年作为 参 照,其第一天是星期六{int sum=0;9 / 140 2010 五月内 科大 acm 题 库 汇 编 if(y&=2000) { for(i=2000;i&y;i++) { sum+=getYearDays(i); } return (sum+6)%7; } else { for(i=y;i&2000;i++) {sum+=getYearDays(i);} return (-sum%7+6)%7; }}int getYearDays(int y){return isLeap(y)?366:365;}int isLeap(int y){return y%4==0&&y%100!=0||y%400==0;}int getMonthWeekDay(int y, int m)//计 算每一月的第一天是星期几{int sum=0;10 / 140 2010 五月内 科大 acm 题 库 汇 编for(i=1;i&m;i++) { sum+=getMonthDays(y,i); } return}int getMonthDays(int y,int m){switch(m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return isLeap(y)?29:28; default: return 0; }}void printYear(int y){11 / 140 2010 五月内 科大 acm 题 库 汇 编 count=1; for(i=1;i&=12;i++) { printMonth(y,i); }}void printMonth(int y, int m){int i=0; cout&&endl&&&*************************&&&m&&&月****************************&&&endl&&w=getMonthWeekDay(y,m); for(i=0;i&w;i++) { printf(& } for(i=1;i&=getMonthDays(y,m);i++) { printf(&%7i&,i); w++; w%=7; if(w==0&&i&getMonthDays(y,m)) { printf(&\n&); } } cout&&}&);递 归Children’s Queue12 / 140 2010 五月内 科大 acm 题 库 汇 编Time Limit:
MS (Java/Others) Memory Limit:
K (Java/Others) Total Submission(s): 1327 Accepted Submission(s): 397 Problem Description There are many students in PHT School. One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single. In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is like FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM Here F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7. Can you make a program to find the total number of queue with n children?InputThere are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means thenumber of children (1&=n&=1000)Output For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs.Sample Input 1 2 3Sample Output 1 2 4题目大意: 一个 队 伍中有 n 个 学 生,但规 定女生不能单 独 站,也就是说,要么 队 伍中没 有女生,要么 有两 个 或两 个 以上的女生站在一起( 力的体现 !)。问 有多少这 样 的队伍。 这是袒护 弱势我的思路: 设 n 个 学 生生按规 则 排的队列有 f(n)种,那么 当 总 数 少一个 时 会 是什么 况 呢?显然,要么少一个 男 的,要么少一个 女的。故有如下况 : (1) 少一个 男的,也就是说,第 n 个 加进 去的是男生。此时 ,队 列 n-1 只需按原规 则 站好即可,故 有 f(n-1)种 方。(2) 少一个女的,也就是说 ,第 n 个加进去的是女生。此时,前面的肯定不能是男生,因为后面加进去的女生只有一个,不符合规 则 ,因此第 n-1 个(也就是前 1 个)必需是女生。若 n-2 个 是按规 则 站好的, 则 有 f(n-2)种方法;若 n-2 个不是按规 则 站好的(因为 第 n-1 个 ,第 n 个是女生,所以第 n-2 个可以是女 生,第 n-3 个 可以是男生。当 没 加进 第 n-1 和第 n 个 女生的时 候,这是不合规 则 的),即第 n-2 个是女 生,第 n-3 个 是男生,此后第 n-4 个 必需按规 则 站好,故有 f(n-4)种 方法。 于是得递推公式: f(n)=f(n-1)+f(n-2)+f(n-4); 下一步就要确定初始条 件: 由于递推公式有 f(n-1)、f(n-2)和 f(n-4),故必需给出 f(1)、f(2) 、f(3)和 f(4) 由题意得:f(1)=1;f(2) =2;f(3)=4; f(4)=7。 注意:由于本题 数 据量较 量大,必需要用高精度,同时用数 组 留存结果来代替递 归 。 #include&iostream& int main(){int i,j,n; int num[1000][35]={0};13 / 140 2010 五月内 科大 acm 题 库 汇 编num[0][0]=1;num[1][0]=2; num[2][0]=4; num[3][0]=7;for(i=4;i&1000;i++) {for(j=0;j&35;j++)num[i][j]=num[i-1][j]+num[i-2][j]+num[i-4][j]; for(j=0;j&34;j++) { if(num[i][j]&) { num[i][j+1]+=num[i][j]/; num[i][j]%=; } } } while(scanf(&%d&,&n)!=EOF){for(i=34;i&0;i--) { if(num[n-1][i]!=0) } printf(&%d&,num[n-1][i]); for(j=i-1;j&=0;j--) printf(&%08d&,num[n-1][j]); printf(&\n&);}return 0;}正方形 #include&stdio.h&14 / 140 2010 五月内 科大 acm 题 库 汇 编__int64 f(int n){if(n==0) return 0; else return f(n-1)+n*n;}int main(){ scanf(&%d&,&n); printf(&%I64d&,f(n)); return 0;}Redraiment 小时候走路喜跳跳,他最喜梯上跳跳去。欢在楼 来 但年幼的他一次只能走上一阶 或者一下子蹦 上两 阶 。 现 在一共有 N 阶台阶,请 你 计算一下 Redraiment 从第 0 阶 到第 N 阶 共有几种 走法。欢 蹦 蹦输入 输 入包括多组 数 据。每组 数 据包括一行:N(1≤N≤40)。 输 入以 0 结 束。输出 对 应 每个 输 入包括一个 输 出。 为 redraiment 到达 第 n 阶 不同走法的数 量。 样例 入输1 2 0样例 出输1 2 #include &stdio.h& int main(){15 / 140 2010 五月内 科大 acm 题 库 汇 编int f[41] = {1, 1}, n, for(i = 2; i &= 40; i++) f[i] = f[i-1] + f[i-2]; while(scanf(&%d&, &n), n) printf(&%d\n&, f[n]);return 0;}蟠桃记孙 悟空在大闹 蟠桃园 的时候,第一天吃掉了所有桃子总 数 一半多一个 ,第二天又将 剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个 ,到第 n 天准备 吃的时候只剩下一个桃子。这下可把神仙们 心疼坏了, 算一下,第一天开 始吃的时 候桃子一共有多少个桃子。请 帮 忙计输入据有多占一行,包含一个正整数输 入数 组 ,每组 发 生的。 输 入以 0 结 束。 输出n(1≤n≤30),表示只剩下一个桃子的时候是在第 n 天对 于每组 输 入数 据,输 样例 入输出第一天开始吃的时候桃子的总 数 ,每个 测 试 实 例占一行。2 4 0样例 出输4 22 #include&stdio.h& int main(){ long k=1; do{scanf(&%d&,&n);16 / 140 2010 五月内 科大 acm 题 库 汇 编if(n!=0){ for(int i=0;i&n-1;i++){k=(k+1)*2;}printf(&%d\n&,k); k=1;} }while(n!=0);return 0;}养 兔子一对成熟的兔子每天能且只能产下一对 小兔子,每次都生一公一母,每只小兔子的成熟期是一天。某人领养 了一对小 子,一公一母,请 问 第 N 天以后,他将 会 得到多少对 兔 子。 兔 输入 测 试 数 据包括多组,每组 一行,为 整数 n(1≤n≤90)。 输 入以 0 结 束。 输出 对 应 输 出第 n 天有几对 兔 子(假设 没 有兔 子死亡现 象,而且是一夫一妻制)。 样例 入输1 2 0样例 出输1 2 提示数 据类 型可以用 64 位整数:__int64#include&iostream&17 / 140 2010 五月内 科大 acm 题 库 汇 编int main(){__int64 f[91]={1,1}; int n,i; for(i=2;i&=90;i++) f[i]=f[i-1]+f[i-2]; while(scanf(&%d&,&n),n) printf(&%I64d\n&,f[n]); return 0;}汉 诺塔 III 约 19 世纪 末,在欧 州的商店中出售一种智力玩具,在一块 铜 板上有三根杆,最左边 的杆上自上而下、由小到大顺序串着由 64 个 圆 盘 构 成的塔。目的是将最左边 杆上的盘 全部移到右边 的杆上,条件是一次只能 移 ,且不允 放在小盘的上面。动一个 盘 许 大盘 现 在我们改变 游 的玩法,不允许 直接从 最左(右)边移到最右(左)边 (每次移动 一定是移到中间杆或从 中间 戏 放到下 的上面。移出),也不允许 大盘 盘 Daisy 已经做过原来的汉 诺 塔问 题 和汉 诺 塔 II,但碰到这 个 问 题 时,她想了很久都不能解决 ,现 在请 你 帮 助她。现 在有 N 个 圆 盘 ,她 至少多少次移动才能把 移到最右边?这些圆 盘 从最左边输入包含多组 数 据,每次输入一个 N 值(1&=N&35)。输出 对 于每组 数 据,输出移动 最小的次数。 样例 入输1 3 12样例 出输2 26 531440 #include&iostream& __int64 m(__int64 n){18 / 140 2010 五月内 科大 acm 题 库 汇 编if(n==1) return 2;return 3*m(n-1)+2;}int main(){__int64while(scanf(&%I64d&,&n)!=EOF) { printf(&%I64d\n&,m(n)); }return 0;}ZOJ 1629 Counting Triangles Given an equilateral triangle with n the length of its side, program to count how manytriangles in it.InputThe length n (n &= 500) of the equilateral triangle's side, one per line. process to the end of the fileOutputThe number of triangles in the equilateral triangle, one per line.Sample Input 1 2 3 Sample Output 1 5 13可以从 递 推的角度去思考!!! 每增加 1 列多出 2*n-1 个 单 位边 长 的三角形,分上三角和下三角考虑!!! 1 -& 1 2 -& 5 3 -& 13 4 -& 2719 / 140 2010 五月内 科大 acm 题 库 汇 编5 -& 48 10 -& 315 500 -&
#include&iostream&int main(){int i,j,f[502]; f[1]=1;for(i=2;i&=500;i+=2) { f[i]=f[i-1]+i*(i+1)/2;f[i]=f[i]+i/2; j=i/2; f[i]=f[i]+j*(j-1);f[i+1]=f[i]+(i+1)*(i+2)/2; f[i+1]=f[i+1]+j*(j+1); }while(cin&&j) cout&&f[j]&& return 0;}ZOJ 1629 Counting Triangles Given an equilateral triangle with n the length of its side, program to count how manytriangles in it. InputThe length n (n &= 500) of the equilateral triangle's side, one per line. process to the end of the fileOutputThe number of triangles in the equilateral triangle, one per line.Sample Input 1 2 3 Sample Output 1 520 / 140 2010 五月内 科大 acm 题 库 汇 编13Counting Triangles注意还有倒着的三角形...边长为 1 的三角形有 n*n 个,然后正着的三角形很好数,sigma(i * (i + 1) / 2)(1 & i & n),倒着的三角形可以这样理解:如果计算便成为 i 的三角形,那么在边长为 j 的行,一定能找到 j - i + 1 个这样的三角形,用循环累加即可。注意下,如果 i + j & n 了,那么就不会再有倒着的三角形了。 #include&iostream&int main (){ while(cin&&n){int r=n*n;for(int i=1;i&n;i++)r+=(i+1)*i/2;for(i=2;i&=n/2;i++) { for(int j=i;j&n;j++) {if(i+j&n)r+=j-i+1; } }cout&&r&&}return 0;21 / 140 2010 五月内 科大 acm 题 库 汇 编}骨牌 方格铺 在 2× n 的一个 长 方形方格中,用一个 1× 2 的骨牌铺 满 方格,输 入 n ,输出铺放方案的总 数 . 例如 n=3 时 ,为 2× 3 方格,骨牌的铺 放方案有三种 ,如下图:输入 输 入数 据由多行组 成,每行包含一个 整数 n,表示该 测 试 实 例的长方形方格的规格是 2× n (0&n&=50)。 输出 对 于每个 测 试 实 例,请 输 出铺 放方案的总 数 ,每个 实 例的输出占一行。 样例 入输1 3 2样例 出输1 3 2 include&stdio.h& int main(){__int64 s[50]={1,2};int n,i; for(i=2;i&50;i++){ s[i]=s[i-2]+s[i-1]; } while(scanf(&%d&,&n)!=EOF)22 / 140 2010 五月内 科大 acm 题 库 汇 编{ printf(&%I64d\n&,s[n-1]); }return 0;}不容易系列之二你 活的不容易,我活的不容易,他活的也不容易。不过 ,如果你 看了下面的故事,就会 知道,有位老汉比 你 还 不容易。重庆市郊黄 泥板村的徐老汉(大号 徐东 海,简 称 XDH)这 两 年辛辛苦苦养了不少羊,到了今年夏天,由 于众 所周知的高温 干旱,实 在没 办 法解决 牲畜的饮 水问 题 ,就决 定把这些羊都赶到集市去卖 。从 黄 泥板村 站和徐老 到交易地点要经 过 N 个收费站,按 系,但是事实却令徐老汉 欲哭无泪 :说 这 收 费 汉 没 什么 关(镜 头 回放) 近景:老汉,一群羊 远景:公路,收费 站 ...... 收费 员 (彬彬有礼+职 业 微笑):“老同志,请 交过 路费 !” 徐老汉 (愕然,反应 迟 钝 状 ):“锅,锅,锅,锅-炉-费 ?我家不烧 锅 炉呀?” 收费 员 (职 业 微笑依然):“老同志,我说的是过 -路-费,就是你 的羊要过 这 个 路口必须 交费 , understand?” 徐老汉(近镜 头 10 秒,嘴巴张 开 ):“我-我-我知道汽车 过 路要收 羊也要收 呀?” 费,这 费 收费 员 (居高临下+不解状):“老同志,你 怎 么就不明白呢,那么我问 你 ,汽车几个 轮 子?” 徐老汉 (稍放松):“这 个 我知道,今天在家里我孙 子还 问 我这 个 问 题 ,4 个 !” 收费 员 (生气,站起):“嘿!老 然知道汽 道就不知道车 四个 轮 子,难 这羊有头 ,你 还 骂 人不带 脏 字,既 几条腿吗?!”徐老汉 (尴 尬,依然不解状):“也,也,也是 4 个 呀,这 有关 系吗 ?”收费 员 (生气 ,站起):“怎 么 没 关 系!我们 头 说 了,只要是 4 条腿的都要收费!” ...... (画 外音) 由于徐老 的是,后面每过一个收费 汉 没 钱,收费 员 就将他的羊拿走一半,看到老当 时水涟 涟 ,犹豫了一下,又还 给 老汉一只。巧合汉 泪站,都是拿走羊的一半,然后退 一只,等到老汉到达市场,就只剩下 3 只 还 羊了。你 ,当代有良知的青年,能帮忙算一下老汉最初有多少只羊吗? 输入 输 入数 据第一行是一个 整数N,表示测 试 数据的组 数 ,下 a(0&a&=30),面由 N 行组 成,每行包含一个 整数 表示收费站的数 量。23 / 140 2010 五月内 科大 acm 题 库 汇 编输出 对 于每个 测 试 实 例,请 输 出最初的羊的数量,每个 测 试 实 例的输 出占一行。 样例 入输2 1 2样例 出输4 6 #include&iostream&int main(){int N,a; cin&&N; while(N--){result=3; cin&&a;for(int i=0;i&a;i++) { result=(result-1)*2; } cout&&result&& }return 0;}神、上帝以及老天爷24 / 140 2010 五月内 科大 acm 题 库 汇 编TZC 2008 ACM contest 的颁 奖 晚 会 隆重开 始了! 为 了活跃 气 氛,组 织 行了一 生面、奖 品丰厚的抽奖 活动 ,这 个 活动的具体要求是这 样 的: 个 别 有自己名字的字 放入抽 箱中; 者举 开 首先,所有 参加晚 会 的人员都将 一张 写 条 奖 然后,待所有字条加入完毕,每人从箱中取一个 字条 ; 最后,如果取得的字 的就是自己的名字,那么 “恭喜你,中奖 了!” 条上写 品是大家 寐以求的 Twins 签 名照呀!不过 ,正如 大家可以想象一下 当 时 的气氛之热 烈,毕竟中奖 者的奖 梦 所有试 图 设 计 的喜剧 往往以悲剧 结 尾,这次抽奖 活动 最后竟然没有一个 人中奖! 我的神、上帝以及老天爷 呀,怎 么 会 这 样呢? 不过,先不要激动,现 在问 题 来 了,你 能计 算一下发 生这 种 情况的概率吗 ? 不 也想以悲剧 结 尾?!会算?难 道你输入 输 入数 据的第一行是一个 整数 C,表示测 试 实 例的个 数 ,然后是 C 行数据,每行包含一个整数n(1&n&=20),表示参 加抽奖的人数 。输出 对 于每个 测 试 实 例,请 输 出发 生这 种 情况的百分比,每个 实 例的输 出占一行, 结果保留两位小数 (四舍五入),具体格式请 参 照 sample output。样例 入输1 2样例 出输50.00% #include&iostream&int main(){int n,a; int sum,i; double f[100]; cin&&n; while(n--){scanf(&%d&,&a); sum=1; for(i=1;i&=a;i++) sum*=i; f[2]=1;25 / 140 2010 五月内 科大 acm 题 库 汇 编f[3]=2; for(i=4;i&=a;i++)f[i]=(i-1)*(f[i-1]+f[i-2]); if(a&7) printf(&%.2lf%%\n&,f[a]*100.0/sum); else printf(&36.79%%\n&); }return 0;}母牛的故事 有一头 母牛,它 每年年初生一头小母牛。每头小母牛从第四个 年头 开始,每年年初也生一头小母牛。请 编程实 现 在第 n 年的时 候,共有多少头母牛?输入 输 入数 据由多个 测 试 实 例组成,每个 测 试 实 例占一行,包括一个整数 n(0&n&55),n 的含义如题 目中描述。 n=0 表示输入数据的结 束,不做处理。输出 对 于每个 测 试 实 例,输出在第 n 年的时 候母牛的数量。每个 输 出占一行。样例 入输2 4 5 0样例 出输2 4 6 #include&iostream& int main(){int F[55]={1,2,3};26 / 140 2010 五月内 科大 acm 题 库 汇 编for(int i=3;i&55;i++){F[i]=F[i-1]+F[i-3];}while(cin&&n,n){cout&&F[n-1]&&}return 0;}字符串与 数 组 处 理描述 琛琛今天参 加高中同学 聚会 ,知道了好多同学 的联 系方式,高兴 ing~~~可惜没 过 多久,他发 现 他把所有同学 的名字都写 到通讯 录 的一行里去了,他怎 么 也分不清他到底有哪 些同学.不过 还 好,他记得一些好朋友的名字 (尤其是女生),他希在所有的名字里找到这些他熟悉的名字......输入多组 输 入数 据. 每组 数 据第一行包含一个 整数 N(1&=N&=10) ,表示琛琛记 得的朋友的个 数 .接下来 一行字 符串是琛琛的通讯 录 .最后 N 行每行有一个 字符串,表示每个琛琛记 得的名字. 所有字符串长度都不超过 1000,都由英文字母组成.输出 对 于每组 输 入数 据,对 琛琛记得的每个名字,查 找在琛琛的通讯 录 中是否存在. 如果存在输 出 yes,否则 输 出no样例 入输3 aaaab a ab c样例 出输yes yes no #include&stdio.h& int main()27 / 140 2010 五月内 科大 acm 题 库 汇 编{int N,i,j,p,q=0,b; char A[11][1001];while(scanf(&%d&,&N)!=EOF) {getchar();for(i=0;i&=1000;i++) { scanf(&%c&,&A[0][i]);if(A[0][i]=='\n')}b=i; for(i=1;i&=N;i++){ for(j=0;j&=1000;j++){scanf(&%c&,&A[i][j]);if(A[i][j]=='\n')}for(p=0;p&b;p++){if(A[i][q]==A[0][p])q++; else{if(q!=0) p--; q=0;}if(q==j)28 / 140 2010 五月内 科大 acm 题 库 汇 编}if(q==j) printf(&yes\n&); else printf(&no\n&);} }return 0;}选 礼物 时 间 限制(普通/Java):1000MS/10000MS 总提交:462 运 行内 存限制:65536KByte 测 试 通过:143描述 xFengChenx MM 今天特 序将所有礼别高 ,因兴 为 她物排成一行,每个 礼 物对 应各地同 的生日 物。 她按照收到包裹的顺 来 自全国 学寄来 礼 一定的价值(不一定是正数 ),xFengChenx MM 希从 这些礼物收到了里挑选 连 续 的一段(一个或连 续 多个 )礼物,使其总 价值 在所有的连 续 片断 中最大。输入多组 数 据。每组 数 据第一行为 一个 正数 N(1&=N&=100),表示礼 物的个 数 。第二行包含 N 个整数 ,按 照 的先后顺 序,分别 表示第 1 个,第 2 个。。。。第 N 个 礼 物的价值。每个 礼 物价值 的绝 对 值礼物到来不超过 100。输出每组 数 据输 出一行, ,表示所有 最大的 子片段。 为一个整数 礼物中总 价值 连 续样例 入输5 123 45样例 出输15题目 源来Narashy#include &stdio.h&29 / 140 2010 五月内 科大 acm 题 库 汇 编int main(){int n=0,i,l,t; int a[10000];while(scanf(&%d&,&n)!=EOF) { for(i=0;i&n;i++) { scanf(&%d&,&a[i]); if(i!=0) { if(a[i]+t&l)l=a[i]+t; if(a[i]+t&a[i])t=t+a[i]; else t=a[i]; if(a[i]&l) t=l=a[i]; }elset=l=a[0]; } printf(&%d\n&,l); }return 0;}词 组 缩 写#include &stdio.h& int main(void){int t,i,k,30 / 140 2010 五月内 科大 acm 题 库 汇 编char s,result[31];scanf(&%d&,&t);for(i=0; i& ++i) {k=0,flag=1;scanf(& %c&,&s); while(s != '\n') { if(s != ' ' && flag == 1) {if(s&='a') s -= 32;result[k++]=s;flag = 0;} else if(s == ' ') {flag=1;} scanf(&%c&,&s); } result[k]='\0'; printf(&%s\n&,result); }return 0;}奇偶求值 #include &stdio.h& int main(void){int n,i,j,A[2001]={0},p=0,q=0,f=0,g=0;scanf(&%d&,&n);31 / 140 2010 五月内 科大 acm 题 库 汇 编for(j=0; j& ++j) { scanf(&%d&,&i);if(i&0) ++A[i+1000]; else if(i&0) ++A[-i]; else ++g;} for(i=1000; i&0 ; --i) {if(A[i]==0) f++; if(A[i]%2==0){ p += -i*A[i]/2; q += -i*A[i]/2; }else{if(f%2!=0) p += -i; elseq += -i; p += -i*(A[i]-1)/2; q += -i*(A[i]-1)/2; }f += A[i]-1;}f +=32 / 140 2010 五月内 科大 acm 题 库 汇 编for(i=1001; i&2001 ; ++i) {if(A[i]==0) f++; if(A[i]%2==0){ p += (i-1000)*A[i]/2; q += (i-1000)*A[i]/2; }else{if(f%2!=0)p += (i-1000);elseq += (i-1000); p += (i-1000)*(A[i]-1)/2; q += (i-1000)*(A[i]-1)/2; }f += A[i]-1;}if(p&q)printf(&%d\n&,p-q);elseprintf(&%d&,q-p);system(&PAUSE&); return 0;}X 形图自相似的图样被称为分形,例如如下图形: 它的基本形(深度为 1)是 X33 / 140 2010 五月内 科大 acm 题 库 汇 编由它自身组成深度为 2 的图形是 XX X XX 由深度为 n-1 的图形组成的深度为 n 的图形,是按照如下规则组成的: B(n-1) B(n-1) B(n-1) B(n-1) B(n-1)输入第一行为测试数据的个数 T(T&=20) 每组输入数据一行,为图形深度(不超过 7)输出对于每组输入数据,输出给定图形.每组数据后有一个空行 样例输入2 2 3样例输出X X X X XX X X X X X X X X X X X X X XX X X X XX X X X X34 / 140 2010 五月内 科大 acm 题 库 汇 编提示注意换行和空格,样例没有对齐,可以把它复制出来到记事本查看递 归 法#include&math.h& #include&string.h& #include&stdio.h&char a[750][750]; int f(int b,int p,int q){int m=(int)pow(3,b-1); int n=m/3,l=2*m/3; if(b==1) { a[p][q]='X'; return 0; } else if(b&1) { f(b-1,p,q); f(b-1,p,l+q); f(b-1,l+p,q); f(b-1,n+p,n+q); f(b-1,l+p,l+q); } return 0;}int main()35 / 140 2010 五月内 科大 acm 题 库 汇 编{int h,e,x,y,z;scanf(&%d&,&e);for(x=0;x&e;x++) { scanf(&%d&,&h); memset(a,' ',sizeof(a)); f(h,0,0); for(y=0;y&pow(3,h-1);y++) { for(z=0;z&pow(3,h-1);z++) { printf(&%c&,a[z][y]); } printf(&\n&); } printf(&\n&); } return 0;}数 学法 #include &stdio.h& #include &string& #include &math.h& #define max 800 char chx[800][800]; void drawx(int n){int i,j,a; a=pow(3,n-1); for (i=0;i&a;i++) { for (j=0;j&a;j++)36 / 140 2010 五月内 科大 acm 题 库 汇 编{ printf(&%c&,chx[i][j]); } printf(&\n&); } printf(&\n&);}int main(){int n,m,i,j,k,a; memset(chx,' ',sizeof(chx)); chx[0][0]='X'; for (k=1;k&7;k++) { a=pow(3,k-1); for (i=0;i&a;i++) { for (j=0;j&a;j++) {chx[2*a+i][j]=chx[i][j];chx[a+i][a+j]=chx[i][j];chx[i][2*a+j]=chx[i][j]; chx[2*a+i][2*a+j]=chx[i][j]; } } } scanf(&%d&,&n); while (n--) { scanf(&%d&,&m); drawx(m); }} 37 / 140 2010 五月内 科大 acm 题 库 汇 编Lab 杯 Description 生都是 球的狂 分子,都强 “Lab 杯”乒 乓 球赛 就要在 PKU 的实 验 室之间 举 行了。人工智能 实 验 室的学 乒 乓 热 烈希代表实 验 室去比赛 。但是有余名额限制,他们 之中只能由一个 人被选 作代表。 ,每一 程公平,他们 决 定打一次 都打一 五局三胜的比赛 。赢 得最多 为 了让 选 择 的过 单 循环 赛 对 学 生之间 场 室去比 比赛的人就 在 Ava 手里有一 表,表里面 了每一场 比赛 的比分。她 应 该 让 谁 赛。现 份 记 录 去比赛 ? 将代表实 验 Input输 入包含一组 测 试 数 据。第一行包含 n(2 ≤ n ≤ 100),实 验 室里学生的数 目。接下来 给 出一个 n × n矩阵 A。矩阵 的每一个 元素都是 0、1、2、3 中的一个。第 i 行第 j 列的元素 aij是第 i 个 学 生在和第 j 个 学 生的比赛 中赢 的局数 。aij和 aji(i ≠ j)正好有一个 是 3,另外一个 小于 3。矩阵 的所有对 角线 元素都是 0。 Output输 出赢 了最多比赛 的学 生的编 号 。如果有平分,选 择 编 号 最小的。Sample Input 4 0 0 3 2 3 0 3 1 2 2 0 2 3 3 3 0 Sample Output 4 #include&iostream& int a[100][100]; int b[100]; int main(){ cin&&c; int i,j; for(i=0;i&c;i++) for(j=0;j&c;j++) cin&&a[i][j];38 / 140 2010 五月内 科大 acm 题 库 汇 编for(i=0;i&c;i++) for(j=0;j&c;j++) { if(a[i][j]==3) a[i][i]++; } for(i=0;i&c;i++) b[i]=a[i][i]; for(i=1;i&c;i++) { if(a[i-1][i-1]&a[i][i]) { a[i][i]=a[i-1][i-1]; } } for(i=0;i&c;i++) { if(b[i]==a[c-1][c-1]) { cout&&i+1&& } } return 1;}史上最 的难 Time Limit: 1000MSTotal Submissions: 9958问 题Memory Limit: 10000K Accepted: 5672Description39 / 140 2010 五月内 科大 acm 题 库 汇 编儒略?凯 撒生活在充满 危险 和阴 谋的年代,而其中最艰 难 的状 况 莫过 于求得生存。于是他发 明了最早的密码 系 之一,用于军 队 的消息传 递 。 中的一名 官,需要把 统送的消息破。消息加密的法假设 你 是凯 撒军 团 军 是:对 消息原文中的每个 字母,分别 用该凯 撒发译 出来 ,并 提供给 你 的将 军 办 字母之后的第 5 个字母替换(例如:消息原文中的每个字母 A 都分别替换 成字母 F)。而你 要获 得消息原文,也就是要将 这 个 过 程反过 来 。 密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 注意:只有字母 Input 最多不超过 100 个 数 据集组成,每个 数 据集之间 不会会 发 生替换,其他非字母的字符不变 ,并且消息原文的所有字母都是大写的。有空行,每个 数 据集由 3 部分组成:1. 2. 3.起始行:START 密码消息:由 1 到 200 个字符组 成一行,表示 出的一 消息. 凯撒发 条 结 束行:END在最后一个 数 据集之后,是另一行:ENDOFINPUT Output 每个 数 据集对 应 一行,是凯撒的原始消息。 Sample Input START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT Sample Output IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSESI WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROMEDANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE #include&iostream& #include&string&40 / 140 2010 五月内 科大 acm 题 库 汇 编 char str[200]; char sw[10];char ST[6]={&START&};char EOI[11]={&ENDOFINPUT&}; char EN[4]={&END&}; int main(){while(gets(sw)) { if(strcmp(sw,ST)==0) { gets(str); gets(sw); if(strcmp(sw,EN)==0) { for(k=0;k&200;k++) { if(str[k]==13) else if(str[k]&=65&&str[k]&=90) { str[k]=str[k]-5; if(str[k]&65) str[k]=str[k]+26; } } puts(str); } else41 / 140 2010 五月内 科大 acm 题 库 汇 编return -1; } else if(strcmp(sw,EOI)==0) else return -1; } return 1;}渊子赛 马 赛 马是一古老的游戏 ,早在公元前四世纪的中国 ,处 在诸 侯割据的状 态 ,历 史上称 为 “战 国 时期”。在魏国 受到同僚庞作官的孙 膑 ,因为涓的迫害,被使臣救出后,到达 齐 国 国 都。齐 国目。上至 王,下到大臣,常常以赛 马 取乐,并以重金赌 输 赢。田 赛 马 是当 时 最受齐 国 贵族欢迎的娱 乐 国 了,回家后 安慰他说 :“下 项 。一天他 闷 闷 不乐。孙 膑 赛 马 又输 忌多次与 国 王及其他大臣 赌 输 赢 ,屡 赌 屡输次有机会 带 我到马 场 看看,也许我能帮 你 。” 孙 膑 仔细 观 察后发 现 ,田忌的马和其他人的,只是策略,以致失。运 用不当 败 比赛前田忌按照孙 膑 的主意,用上等马 鞍将 下等马 装饰 起来 ,冒充上等马 ,与 齐 王的上等马 比赛 。第二场 比 王的中等 ,在一片喝彩中,只 田忌的 竟 是按照孙 膑 的安排,田忌用自己的上等 赛,还 马 与 国 马 比赛 见 马 然冲到 王的下等 ,田忌的 又一次 前面,赢 了第二 的第三场,田忌的中等 齐王的马 场 。关 键 马 和国 马比赛 马 冲到 前面, 果二比一,田忌赢了国王。 国 王的马 结 都有恒定的速度,所以速度大的 一定比速度小的马马相差并 不远就是这 么 简 单 ,现在渊子也来 赛 一赛 马 。假设每匹马 马 先到终 点(没有意外!!)。不允许 出现 平局。最后谁 赢 的场 数 多于一半(不包括一半),谁 就是赢家(可 能没有赢 家)。渊 子有 N(1≤N≤1000)匹马 参 加比赛 。对 手的马的数量与 渊 子马 的数 量一样,并且知道所有 的马的速度。 果,看看渊 子能否赢 得比赛 。聪 明的你 来 预 测 一下这 场 世纪 之战 的 结输入 输 入有多组 测 试 数 据。每组 测 试 数 据包括 3 行: 第一行输入 N(1≤N≤1000)。表示马 的数 量。 第二行有 N 个 整型数字,即渊子的 N 匹马 的速 度。 第三行有 N 个 整型数字,即对手的 N 匹马 的速 度。 当 N 为 0 时 退出。输出若通过 聪 明的你 精心安排,如果渊 子能赢得比赛 ,那么 输 出“YES”。 否则 输 出“NO”。样例 入输5 2 3 3 4 5 1 2 3 4 5 4 2 2 1 242 / 140 2010 五月内 科大 acm 题 库 汇 编2 2 3 1 0样例 出输YES NO #include&stdio.h& void qsort(long array[],int left,int right) { int l,r,k; if(left&right) { l= r= k=array[l]; do { while((l&r)&&(array[r]&=k)) r=r-1; if(l&r) { array[l]=array[r]; l=l+1; } while((l&r)&&(array[l]&=k)) l=l+1; if(l&r) { array[r]=array[l]; r=r-1; } }while(l!=r); array[l]=k; qsort(array,left,l-1);43 / 140 2010 五月内 科大 acm 题 库 汇 编qsort(array,l+1,right); } } int main() { long a[1001],b[1001],N; do { scanf(&%d&,&N); if(N!=0) { for(i=0;i&N;i++) scanf(&%d&,&a[i]); for(i=0;i&N;i++) scanf(&%d&,&b[i]); qsort(a,0,N-1); qsort(b,0,N-1); if(N%2==1) { flag=1; for(i=N-1;i&N/2-1;i--) {if(a[i]&=b[i-N/2]) { printf(&NO\n&); flag=0; } } if(flag==1)44 / 140 2010 五月内 科大 acm 题 库 汇 编printf(&YES\n&); } if(N%2==0) { flag=1; for(i=N-1;i&=N/2-1;i--) {if(a[i]&=b[i-N/2+1]) { printf(&NO\n&); flag=0; } } if(flag==1) printf(&YES\n&); } } }while(N!=0); return 0;}简 单密 破解码密生活中非常重要的一点不能 的秘密就全靠了。哇哈哈.码是我们 东 东 ,我们的那么 说 它 接下来 渊 子要在密码 之上再加一套密码 ,虽 然简 单 但也安全。 假设 渊 子原来一个 BBS 上的密码 为 zvbo941987,为 了方便记 忆 ,他通过一种算法把这 个 密码 变 换 成 YUANzi1987,这 个 密码 是他的名字和出生年 忘都忘不了,而且可以明目张 胆地放在显眼的地方 份 ,怎 么 而不被别人知道真正的密码。 他是这 么 变 换 的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv-字母都 字和其他的符号都不做 8 wxyz--9, 0--0,就这 么 简 单 ,渊 子把密 变 成对 应 的数字,数 码 中出现的小写 变 换 ,声明:密码中没有空格,而密码 中出现 的大写 字母则 边 成小写之后往后移一位,如:X,先边成小 写 ,再往后移一位,不就是 y 了嘛,简 单 吧。记住,z 往后移是 a 哦。 输入入包括多输 输出入是一个明文,密度不超过个 测 试 数 据。输100 个 字符, 入直到文件输 结尾。码 长45 / 140 2010 五月内 科大 acm 题 库 汇 编输 出渊 子真 正的密文。 样例 入输YUANzi1987样例 出输zvbo941987题目 源来#include&stdio.h& #include&string.h& int main(){char a[101]; while(gets(a)) {for(int i=0;i&strlen(a);i++){ if(a[i]&=97&&a[i]&=99) a[i]='2'; if(a[i]&=100&&a[i]&=102) a[i]='3';if(a[i]&=103&&a[i]&=105)a[i]='4';if(a[i]&=106&&a[i]&=108)a[i]='5';if(a[i]&=109&&a[i]&=111)a[i]='6';if(a[i]&=112&&a[i]&=115)a[i]='7';if(a[i]&=116&&a[i]&=118)a[i]='8';if(a[i]&=119&&a[i]&=122)a[i]='9'; if(a[i]&=65&&a[i]&=89)46 / 140 2010 五月内 科大 acm 题 库 汇 编a[i]=a[i]+33; if(a[i]==90) a[i]=97; } puts(a); } return 0;}英文金曲大赛 我们在“渊子数”的题 目中已经 了解了渊 子是个什么 样 的人了,他在大一的时 候参 加过 工商学院的“英语 聚 乐 部”。告诉 你 个 秘密, 好地方,不但活动 精彩而且有 MM。这 个 俱乐部是个 这 不,英语 俱乐 部举 办 了一个 叫做“英文金曲大赛 ”的节目。这 个 节 目有好多人参 加,这不,成绩出来了, 渊 子当 是很勇敢,自告奋 勇接下了算出大家的总 得分的任务 。 当 时 有 7 个 评 委,每个 评 委都要给 选 手打分,现 在要求去掉一个最高分和去掉一个最低分,再算出平均 分。结 果精确到小数 点后两位。输入 测 试 数 据包括多个 实 例。每组数 据包括 7 个 实 数,代表 符。 输 入直到文件结 束。输出评委们 对 该 选 手的评分。紧接着是选 手的名字,名字的长度不超过 30 个 字算出每位选 手名字和最终 得分,结 果保留两 位小数。样例 入输10 10 10 10 10 10 9 xiaoyuanwang 0 0 0 0 0 0 0 beast样例 出输xiaoyuanwang 10.00 beast 0.00 #inclde &stdio.h& int main(){double sum, a[7]; char s[31]; while(scanf(&%lf%lf%lf%lf%lf%lf%lf%s&, &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], s) != EOF)47 / 140 2010 五月内 科大 acm 题 库 汇 编{ sum = a[0]; double min1 = a[0], max1 = a[0], for(i = 1; i & 7; i++) { if(min1 & a[i]) min1 = a[i]; if(max1 & a[i]) max1 = a[i]; sum += a[i]; } ave = (sum - min1 - max1) / 5; printf(&%s %.2lf\n&, s, ave); } return 0; } TOJ 1051 A × B problem(大数相乘) A × B problem Redraiment 碰 到了一个 难 题 ,需要请 你 来 帮 忙:给 你 两 个 整数,请 你 计算 A × B。输入 数 据的第一行是整数 T(1 ≤ T ≤ 20),代表测 试 数 据的组 数 。接着有 T 组 数 据,每组 数 据只有一行,包括两 个 非负整数 A 和 B。 但 A 和 B 非常大,Redraiment 能保证 这 些数用 long 来 保存一定会 溢出。 但 A 和 B 的位数最大不会超过 100 位。输出 对 应 每组 测 试 数 据,你都要输 出两 行:第一行为:&Case #:&, # 代表这是第几组 测 试 数 据。 第二行是一个等式:&A * B = Sum&, Sum 代表 A × B 的结 果。 你 要注意这 个 等式里包含了几个空格。 要求每 都需要保留一 空行。 组 数 据之间 个样例 入输2 1 2 765432148 / 140 2010 五月内 科大 acm 题 库 汇 编样例 出输Case 1: 1 * 2 = 2Case 2:
= 635269 #include&iostream& #include&cstring& int main(){ char a[101],b[101]; int c[10001]; cin&&t;int h=1; while(t--) { cin&&a&&b; int l1=strlen(a); int l2=strlen(b); int m=0;int d=0; for(i=0;i&10000;i++)c[i]=0; for(i=l1-1,y=0;i&=0;i--,y++) { d=0; m=y; for(int j=l2-1;j&=0;j--) { k=(a[i]-'0')*(b[j]-'0')+d+c[m]; c[m++]=k%10; d=k/10;49 / 140 2010 五月内 科大 acm 题 库 汇 编} while(d&0) {c[m++]+=d%10; d/=10; } } cout&&&Case &&&h&&':'&& cout&&a&&& * &&&b&&' '&&'='&&' '; for( i=m-1;i&=0;i--)if(c[i]!=0){m=i;} if(i&0)cout&&0; else { for(i=m;i&=0;i--)cout&&c[i]; } if(t!=0)cout&&endl&& h++; } return 0;}字符统 计给 出一串字符,要求统 计 出里面的字母、数 字、空格以及其他字符的个 数 。字母:A, B, ..., Z、a, b, ..., z 组成 数 字:0, 1, ..., 9 空格:& &(不包括引号 ) 剩下的可打印字符全为其他字符。输入 测 试 数 据有多组 。每组 数 据为 一行(长度不超过 100000)。 数 据至文件结 束(EOF)为止。输出每组 输 入对 应 一行输 出。 包括四个整数 a b c d,分别 代表字母、数 字、空格和其他字符的个 数 。样例 入输50 / 140 2010 五月内 科大 acm 题 库 汇 编A0 ,样例 出输1 1 1 1 #include&stdio.h& #include&ctype.h& int main(){char str[100001], while(gets(str)) { long a=0,b=0,c=0,d=0,i=0; for(i=0;str[i]!='\0';i++) { if(isalpha(str[i])) a++;else if(isdigit(str[i]))b++;else if(str[i]==' ')c++;elsed++;} printf(&%ld %ld %ld %ld\n&,a,b,c,d); } return 0; } 漂亮菱形 * *** ***** ******* ***** *** * 上面的菱形漂亮吗? 现 出菱形的高度,要求你打印出相应 高度的菱形,比如上面的菱形高度为 7。给 输入51 / 140 2010 五月内 科大 acm 题 库 汇 编测 试 数 据包括多行,每行 1 个 整数 h,h 为奇数,代表菱形的高度。 输 入以 0 结 束。 输出 输 出每组 对 应的菱形。 样例 入输1 7 0样例 出输* * *** ***** ******* ***** *** * #include&iostream& int main(){ int i,j,k; while(cin&&n,n) { for(i=0;i&(n+1)/2;i++) { for(j=(n-1)/2-i;j&0;j--) { cout&&' '; } for(k=0;k&1+2*i;k++) {52 / 140 2010 五月内 科大 acm 题 库 汇 编cout&&'*'; } cout&& } for(i=0;i&(n-1)/2;i++) { for(j=0;j&1+i;j++) { cout&&' '; } for(k=0;k&n-2*(i+1);k++) { cout&&'*'; } cout&& } } return 0;}C 语 言实 验 题 ―矩阵 转 置 #include&iostream& int main(){int N; int i,j; int a[101][101]; cin&&N; for(i=0;i&N;i++) { for(j=0;j&N;j++) {53 / 140 2010 五月内 科大 acm 题 库 汇 编cin&&a[i][j]; } } for(i=0;i&N;i++) { for(j=0;j&N;j++) { cout&&a[j][i]; if(j&N-1) cout&&' '; } cout&& } return 0;}#include&math.h& #include&string.h& #include&stdio.h& char a[750][750];int f(int b,int p,int q){int m=(int)pow(3,b-1);int n=m/3,l=2*m/3; if(b==1){ a[p][q]='X';return 0;}else if(b&1){f(b-1,p,q); f(b-1,p,l+q);54 / 140 2010 五月内 科大 acm 题 库 汇 编f(b-1,l+p,q); f(b-1,n+p,n+q); f(b-1,l+p,l+q);}return 0;}int main(){int h,e,x,y,z,m; scanf(&%d&,&e); for(x=0;x&e;x++){scanf(&%d&,&h);memset(a,' ',sizeof(a));f(h,0,0); m=pow(3,h-1); for(y=0;y&m;y++){for(z=0;z&m;z++){printf(&%c&,a[z][y]);}printf(&\n&);}printf(&\n&);}return 0;}数字对55 / 140 2010 五月内 科大 acm 题 库 汇 编输 入 N(2≤N≤100)个 数 字,每个 数 字在 0 与 9 之间,根据输入的数 字对 ,统 计 出该 数 字对 出现 的次 数 ,比如 N=20 时,下面的数 字中:0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9,数 字对 (7,8)=2 (8,7)=3。输入 输 入的第一行为 N,第二行为 N 个 数 字。第三行为 数 字对的个 数 M,接下来 是 M 行数 据,每行为一个 数字对。相邻 数 字之间均用空格分开 。输出 输 出数 字对 以及每个 数 字对出现 的次数 ,格式如下:(7,7)=2 如果没 有找到数 字对 ,请 输 出 Not Found!样例 入输20 0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9 3 7 8 8 7 9 0样例 出输(7,8)=2 (8,7)=3 Not Found!#include&iostream&int main(){int N,M; int i,j; char num[101]; char tnum[100][2]; int result[100];56 / 140 2010 五月内 科大 acm 题 库 汇 编cin&&N; for(i=0;i&N;i++){cin&&num[i];}cin&&M; for(i=0;i&M;i++){ cin&&tnum[i][0]&&tnum[i][1];result[i]=0;}for(i=0;i&N-1;i++){for(j=0;j&M;j++){ if(num[i]==tnum[j][0]&&num[i+1]==tnum[j][1])result[j]++;} }for(i=0;i&M;i++){if(result[i]!=0)cout&&'('&&tnum[i][0]&&','&&tnum[i][1]&&&)=&&&result[i]&&elsecout&&&Not Found!&&& }return 0;}数塔问 题73857 / 140 2010 五月内 科大 acm 题 库 汇 编810274445265(Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and endssomewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.输入Your program is to read from standard input. There are several test cases.For each case ,the first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is & 1 but &= 100. The numbers in the triangle, all integers, are between 0 and 99. The end of input is indicated by N = 0 .输出Your program is to write to standard output. The highest sum is written as an integer.样例 入输5 7 3 8 2 4 08 10 744 5265样例 出输30 #include&stdio.h& int a[101],b[101]; int main(){ int n,i,j,temp,*p1,*p2,*t; while(1){ scanf(&%d&,&n); if(n==0) p1=a; p2=b; for(p1[1]=0,i=1;i&=n;i++) { for(j=1;j&=i;j++) { scanf(&%d&,&temp); if(j==1){ p2[1]=p1[1]+ }58 / 140 2010 五月内 科大 acm 题 库 汇 编else if(j==i){ p2[j]=p1[j1]+ } else if(j&1){p2[j]=p1[j-1]+if(p2[j]&p1[j]+temp)p2[j]=p1[j]+} } t=p1; p1=p2; p2=t; } for(temp=p2[1],i=2;i&=n;i++){ if(temp&p1[i]) temp=p1[i]; } printf(&%d\n&,temp); } return 0; }第 K 小的数你 需要在 N 个 数 字中找到第 K 个 小的数字 输入多组 数 据。 每组 数 据第一行是两 个 整数 N,K(N&=5000000 ,K&=N). 下面一行是 入读读 到 N=0 K=0时 输出 对 于每个 输 入,输出第 K 小的数字 样例 入输 结 束N 个 数 字53
1 7 8 14 19 17 2 12 13 20 16 3 9 10 15 6 18 11 4 5 00样例 出输4 2 13 提示 Please use scanf instead of cin or you will Time Limit Exceeded.59 / 140 2010 五月内 科大 acm 题 库 汇 编#include &iostream& #include &algorithm& int a[5000001]; int main() { int N,K,i; while(scanf(&%d%d&,&N,&K)) { if(N*K==0) for(i=0;i&N;i++) scanf(&%d&,&a[i]); sort(a,a+N); printf(&%d\n&,a[K-1]); } return 0; } #include&stdio.h& #include&stdlib.h& int compare_integers(void const *a,void const *b) { register int const *pa = register int const *pb = return *pa & *pb? 1:*pa & *pb ? -1:0; } int a[5000001]; int main(){ int n,i,k; while(1){ scanf(&%d%d&,&n,&k); if(n*k==0) for(i=0;i&n;i++) scanf(&%d&,&a[i]); qsort(a,n,sizeof(int),compare_integers); printf(&%d\n&,a[k-1]); } return 0; } 可怜的毅毅 毅毅刚 刚 上小学三年级 。有一天,老师 给 他出了一道十进 制数的加法题 目,1+1=几。结果毅毅做错了,老师很不高兴,罚毅毅回家做 N 道大整数的加法(最大有80位)。可怜的毅毅需要你 的帮 助……输入本题有多组 测 试 数 据,每组 测 试 数 据有两行,分别表示两 个 非负整数。输出 对 每组 测 试 数 据输出一行,表示两 数 之和。 样例 入输1 1 123 45660 / 140 2010 五月内 科大 acm 题 库 汇 编样例 出输2 579 提示 Leading zeros should be ignored. #include&stdio.h& #include&string.h& int main(){ char a[81],b[81]; int c[82],i,la, while(scanf(&%s%s&,a,b)!=EOF){ la=strlen(a); lb=strlen(b); c[0]=(la&lb?la:lb); for(i=1;i&=c[0]+1;i++) c[i]=0; for(i=1;i&=c[0];i++){ c[i]+=a[--la]+b[--lb]-'0''0'; if(c[i]&=10){ c[i]-=10; c[i+1]++; } if(la&=0||lb&=0) } while(la&0)c[++i]+=a[--la]-'0'; while(lb&0)c[++i]+=b[--lb]-'0'; if(c[c[0]+1]!=0)printf(&%d&,c[c[0]+1]); for(i=c[0];i&=1;i--)printf(&%d&,c[i]); printf(&\n&); } return 0; } 比 字符串较你 得到一些长 度相等的字符串,现 在你需要比较 这 些字符串,如果它 们 中间 有某些位置的字符不一样,则需要用'?'来 代替。 比如 && 和 &&,比较出来的串是&&。输入第一行输入一个 数 字 n,表示一共有多少字符串(n&=50) 字符串, 下面 n 行,每行 度都相等(字符串长度也&=50)输入一个 它 们 的长输出 输 出一行 变 换 后的串 样例 入输2 contest.txt context.txt样例 出输61 / 140 2010 五月内 科大 acm 题 库 汇 编conte?t.txt#include&stdio.h& #include&stdlib.h& #include&string.h& char a[51][50]; char* compare(int n){ int i,j, char * length=strlen(a[1]); result=(char*)malloc((length+1)*sizeof(char)); strcpy(result,a[1]); for(i=2;i&=n;i++){ for(j=0;j&=j++) if(a[i][j]!=result[j]) result[j]='?'; } } int main(){ int n,i; scanf(&%d&,&n); for(i=1;i&=n;i++) scanf(&%s&,a[i]); printf(&%s\n&,compare(n)); return 0; }做一 正 的南航人个 做人要有一身正气,南航学子都应 该气如此。比如我们 今天的考试就应 该 做到“诚信”为 上。 ,今天也不例外,本题 是要求输 出指定大小的&NUAA&字符串,特别每次考试的第一个 题 目总 是很简 单地,为 了体现“正气”二字,我们要求输 出的字符串也是正方形的(行数 和列数相等)。输入 输 入的第一行包含一个正整数 N(N&=20),表示一共有 N 组 数 据,接着是 N 行数据,每行包含一个正整数 M(M&=20),表示一行内有 M 个“NUAA”相连 。输出 输 出指定大小的方形字符串,输 出格式参 见 样例数据。 样例 入输2 1 2样例 出输NUAA NUAA NUAA NUAA NUAANUAA NUAANUAA62 / 140 2010 五月内 科大 acm 题 库 汇 编NUAANUAANUAANUAA NUAANUAA NUAANUAA NUAANUAA NUAANUAA#include&stdio.h& int main(){ int i,j,n,m; scanf(&%d&,&n); while(n--&0){ scanf(&%d&,&m); for(i=1;i&=m;i++){ for(j=1;j&=4*m;j++){ printf(&NUAA&); if(j%m==0) printf(&\n&); } } } return 0; } 古韵之茶道 茶道者,烹茶 茶,修身养芜 杂 乱性、淡泊明志之道也。其和谐之风,清 静 之 之念;显 生活品悟之道。古人尝 便得道,何 苦心破 。”佳须 烦 恼饮茶之艺 术 也。沏茶、赏茶、饮韵,博文人雅士之心;怡匹夫小民之情;解日高路长 之渴;去荒云:“一饮 涤 昏寐,情思朗爽满 天地;再饮 清 我神,忽如 飞 雨洒轻 尘 ;三饮 茗 还 须 好法沏,水温 茶量待斟酌。水温 、茶量为 茶质 感之限。输入,其范现 有两 数 值 ,数 值 一为水温零至一百,用二围不过 进制表示;数据二即茶量(十进制),弗多于四千万有八。输出请 君输 出水温 与 茶量之积 (十进制)。 样例 入输Input1: 795 Input2: 80样例 出输Output1: 1084770 Output2:63 / 140 2010 五月内 科大 acm 题 库 汇 编654160题目 源来古韵一 #include&stdio.h& #include&string.h& int a[7]; int fn(int n){ int i,t=2; if(n==0) return 1; for(i=2;i&=n;i++) t*=2; } int toten(int *a){ int r=0; for(j=0;j&7;j++) r+=a[j]*fn(6-j); } int main(){unsigned long n,t;for(i=0;i&7;i++) scanf(&%d&,&a[i]); scanf(&%lu&,&n); t=(unsigned long)toten(a); printf(&%lu\n&,n*t); return 0; }谁是组 长信息组 需要选一个 组 长。信息组一共有 n 个 人,分别 用1到 n 编 号 ,其中 m 个 人参 与 了投票。得票数 过 半(票数 大于 m div 2)的人将被选 为 组 长 。 输入数据 告知将 这 m 个 人分别 将 票投给 了谁 ,请 统 计 出谁 将 担任信息组 的组 长 。输入第一行两 个 数 n 和 m。 第二行有 m 个 数 ,这 些数 都是不超过 n 的正整数 ,表明这 m 个人的选 择 。 1&=n&=maxlongint 1&=m&=10000输出 输 出将 被选 为 组 长 的人。如果没有人的票数 过 半,请 输 出-1。 样例 入输64 / 140 2010 五月内 科大 acm 题 库 汇 编74 7727样例 出输7 #include&stdio.h& typedef struct People{ }P People head[10000]; void Insert(long no,long count){ for(i=0;i&i++) if(head[i].no==no){ head[i].n++; } head[i].no= head[i].n=1;}int main(){ int m,i,temp, scanf(&%d%d&,&n,&m); for(count=0,i=1;i&=m;i++){ scanf(&%d&,&temp); Insert(temp,count); count++; } for(i=0;i&i++) if(head[i].n & m/2){ printf(&%d\n&,head[i].no); } if(i &=count) printf(&%d\n&,-1); return 0;}念 字数编 一个 “念数 字”的程序,它能让 计 算机完成以下工作:当 你 输 入一个0至 99 之 间 的数 后,计 算机就会用汉 语 拼音印出这 个 数。 如果输 入的数不在 0 到 99 之间 ,就印出“CUO LE”。 注:为 了使不熟悉 音的同学 也能做这 个 题 ,把“零,一,二,三,……,九,十”的汉 语 拼拼 音法写在下面。零 LING 一 YI 二 ER 三 SAN 四 SI 五 WU 六 LIU 七 QI 八 BA 九 JIU 十 SHI输入 输 入数 据有多组 ,每组 数 据占一行,内 容为 一个 数 字,数 据以 EOF 作为 结 束。 输出65 / 140 2010 五月内 科大 acm 题 库 汇 编输 出对 应 的汉 语 拼 音,字母全部为 大写 。每组 数 据占一行 样例 入输35 0 11 100样例 出输SAN SHI WU LING SHI YI CUO LE #include&iostream&int main(){char py[11][5]={&LING&,&YI&,&ER&,&SAN&,&SI&,&WU&,&LIU&,&QI&,&BA&,&JIU&,&SHI&}; int g,s; while(cin&&n){if(n&0||n&99){ cout&&&CUO LE&&&}g=s=0; g=n%10; s=n/10; if(s==0) cout&&py[g]&&else if(s==1&&g==0) cout&&py[10]&&66 / 140 2010 五月内 科大 acm 题 库 汇 编else if(s==1&&g&0)cout&&py[10]&&' '&&py[g]&&else if(s&1&&g==0)cout&&py[s]&&' '&&py[10]&&else if(s&1&&g&0)cout&&py[s]&&' '&&py[10]&&' '&&py[g]&& }return 0;}More Beautiful当 老师 不容易,尤其是当 小学 的老师 更难 :现在的小朋友做作业喜欢 滥 用括号。然不影虽果,但不响 计 算结 够 美观 错 读 的“陈景润”呢! 为 了减 轻 老师 的工作,不至于他们 工作到深夜,我,容易出 ,而且可性差。但又不能一棒子打死,也许他们 就是将 来 程序把小朋友的作业 做一下简 单 地处理,去掉们 来 写 个那些多余的括号 。 为 了简 化问 题 ,所有式子里只存在小括号,运 算符号 包括+(加)、-(减)、*(乘)、/(除)、^(幂 )。 注意:去掉多余的小括号 不是指运 算结 果一样就可以。 比如:(1+2)^1 = 3。虽然把括号去掉 1+2^1 也等于 3,但我们 说 这 个 括号不能去。 但如:1+(2+3) = 1+2+3 只要是允许的,因为加法是满足交换 律和结合律的。输入 输 入包括多组 测 试 数 据。每组 测 试 数 据为 一行算术 表达 式,只包括数 字和运算符号 ,长 度小于 16。 输 入以#行结束,该 行不做处 理。输出 对 应 每组 数 据输 入都有一行输 出。 输 出去掉多余的括号 后的表达 式。 样例 入输2*(1*(4*3)) 3*(2*(4/1)) ((4*2)/1)*3 (1)+(2)+(3)+(4) 1-(2-(3-4)) ((3*2)*4)^1 #样例 出输2*1*4*367 / 140 2010 五月内 科大 acm 题 库 汇 编3*2*4/14*2/1*3 1+2+3+41-(2-(3-4)) (3*2*4)^1//#include &stdafx.h&#include &stdio.h&#include &string.h& #include &stdlib.h& //#include &iostream.h&int Operate(char str[16],int pos,int &start,int &end,bool bSign[4]); void Hendle(char str[16],int start,int end,bool bSign[4]);int main(){int pos,start, int length=0; bool bSign[4]; char str[16];while(gets(str),str[0]!='#') {pos=0; start=0; end=0;bSign[0]=bSign[1]=bSign[2]=bSign[3]= length=strlen(str);while(pos&length){if(str[pos]=='('){//start=pos+=Operate(str,pos,start,end,bSign);68 / 140 2010 五月内 科大 acm 题 库 汇 编//start--;Hendle(str,start,end,bSign);}pos++;} for(int i=0;i&i++) {if(str[i]!=' ')printf(&%c&,str[i]); }printf(&\n&);}return 0;}int Operate(char str[],int pos,int &start,int &end,bool bSign[]){int TemStart=0; bool bTemSign[4];//bSign[0]=bSign[1]=bSign[2]=bSign[3]=start= pos++;while(str[pos]!=')') {if(str[pos]!='('){switch (str[pos]){case '+': bSign[0]= case '-':69 / 140 2010 五月内 科大 acm 题 库 汇 编bSign[1]= case '*': bSign[2]= case '/': bSign[3]=}}else{TemStart=bTemSign[0]=bTemSign[1]=bTemSign[2]=bTemSign[3]= pos+=Operate(str,pos,TemStart,end,bTemSign); Hendle(str,TemStart,end,bTemSign); }pos++;}end= return end-}void Hendle(char str[],int start,int end,bool bSign[4]){if(str[end+1]!='^') { if(str[start-1]!='+'&&str[start-1]!='-'&&str[start-1]!='*'&&str[start1]!='/'&&str[start-1]!='^'&& str[end+1]!='+'&&str[end+1]!=''&&str[end+1]!='*'&&str[end+1]!='/') str[start]=str[end]=' ';if(bSign[0]==false&&bSign[1]==false&&bSign[2]==false&&bSign[3]==false)70 / 140 2010 五月内 科大 acm 题 库 汇 编str[start]=str[end]=' '; if(str[end+1]=='*'||str[end+1]=='/'&&str[start-1]!='*'&&str[start-1]!='/'){ if(bSign[0]==false&&bSign[1]==false) str[start]=str[end]=' '; } if(start-1&0&&(str[end+1]=='+'||str[end+1]=='-')) { str[start]=str[end]=' '; } if(start-1&=0&&(str[end+1]=='+'||str[end+1]=='-')&&str[start-1]=='(') { str[start]=str[end]=' '; } if(str[start-1]=='/') {if(bSign[0]==false&&bSign[1]==false&&bSign[2]==false&&bSign[3]==false) str[start]=str[end]=' '; } if(str[start-1]=='-') { if(bSign[0]==false&&bSign[1]==false) str[start]=str[end]=' '; } if(str[start-1]=='*'&&str[end+1]!='*'&&str[end+1]!='/') { if(bSign[0]==false&&bSign[1]==false) str[start]=str[end]=' '; } if(str[start-1]=='+') str[start]=str[end]=' ';71 / 140 2010 五月内 科大 acm 题 库 汇 编//if(str[])//str[start]=str[end]=' ';} else if(bSign[0]==false&&bSign[1]==false&&bSign[2]==false&&bSign[3]==false) str[start]=str[end]=' ';}两 数 组 最短距离已知元素从 小到大排列的两 个 数 组x[]和 y[],请 写 出一个 程序算出两 个 数 组彼此之间 差的绝 对 值中最小的一个,这 叫做数 组 的距离。输入第一行为 两 个整数 m, n(1≤m, n≤1000),分别代表数 组 f[], g[]的长度。 第二行有 m 个元素,为 数 组 f[]。 第三行有 n 个元素,为 数 组 g[]。输出 数 组 的最短距离 样例 入输5 5 1 2 3 4 5 6 7 8 9 10样例 出输1 提示你 能想出 O(n+m)的算法吗 ?^_^加油!#include&iostream&#include&math.h& int main(){72 / 140 2010 五月内 科大 acm 题 库 汇 编int m,n;int i,j;char f[1001],g[1001];cin&&m&&n; for(i=0;i&m;i++) cin&&f[i]; for(i=0;i&n;i++) cin&&g[i]; i=0; j=0; k=abs(f[0]-g[0]); while(i&m&&j&n){if(f[i]-g[j]==0){k=0;} if(abs(f[i]-g[j]&k)) {k=abs(f[i]-g[j]);}if(f[i]&g[j]){j++;}if(f[i]&g[j]){i++;} }73 / 140 2010 五月内 科大 acm 题 库 汇 编cout&&k&& return 0;}等值 数 目 已知两 个 整数 数 组 f[]和 g[],它 们 的元素都已经 从 小到大排列。例如 f[]中可能有 1,2,2,3,3,g[]中 有 1,2,2,2,3。 程序,算出 彼此之 有多少 相同的 据。就以上例而言: 请 写 一个 这 两 个 数 组 间 组 数 f[0]于 g[0]是第一组;f[1]于 g[1]是第二组; f[2]于 g[2]是第三组; f[3]于 g[4]是第四组。 输入第一行为 两 个整数 m, n(1≤m, n≤1000),分别代表数 组 f[], g[]的长度。 第二行有 m 个元素,为 数 组 f[]。 第三行有 n 个元素,为 数 组 g[]。输出 输 出等值 数 目。 样例 入输5 5 1 2 2 2 3 1 2 2 3 3样例 出输4#include&iostream&int main(){int m,n; int i,j; int k=0;char f[1001],g[1001];cin&&m&&n; for(i=0;i&m;i++)74 / 140 2010 五月内 科大 acm 题 库 汇 编cin&&f[i]; for(i=0;i&n;i++)cin&&g[i];i=0; j=0; while(i&m&&j&n){if(f[i]==g[j]){k++;i++; j++; }if(f[i]&g[j]){ j++; }if(f[i]&g[j]){ i++; } }cout&&k&& return 0;}FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow. FJ has made a list of R (0 ≤ R ≤ 10,000) lines of the form &cow 17 sees cow 34&. This means that cow 34 is at least as tall as cow 17, and that every cow between 17 and 34 has a height that is strictly smaller than that of cow 17. For each cow from 1..N, determine its maximum possible height, such that all of the information given is still correct. It is guaranteed that it is possible to satisfy all the constraints.输入75 / 140 2010 五月内 科大 acm 题 库 汇 编Line 1: Four space-separated integers: N, I, H and R Lines 2..R+1: Two distinct space-separated integers A and B (1 ≤ A, B ≤ N), indicating that cow A can see cow B.输出Lines 1..N: Line i contains the maximum possible height of cow i.样例 入输9 3 5 5 1 3 5 3 4 3 3 7 9 8样例 出输5 4 5 3 4 4 5 5 #include&iostream& int a[10000][2]={0}; int fun(int m,int n,int k){for(int i=0;i&k;i++) { if(m==a[i][0]&&n==a[i][1])return 0;}return 1;}76 / 140 2010 五月内 科大 acm 题 库 汇 编int main(){int N,I,H,R;int h[10001]={0}; int A,B; int i,j; int k=0; cin&&N&&I&&H&&R; for(i=0;i&R;i++){cin&&A&&B; k++; if(fun(A,B,k)){if(A&=B){a[i][0]=A;a[i][1]=B;h[A]--; h[--B]++;}else{a[i][0]=A; a[i][1]=B;h[B]--; h[--A]++;}} }for(i=0;i&N;i++)77 / 140 2010 五月内 科大 acm 题 库 汇 编{sum=0; for(j=0;j&=i;j++){sum=sum+h[j];}sum=sum+H; cout&&sum&&}return 0;}数 论#include &stdio.h&const int A[]={0,1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99}; // 直接求出来 const int B[]={0,9,18,108,198,998,}; 第几个 数 的关系 const int C[]={0,10,10,100,100,000}; reverse(in

我要回帖

更多关于 acm比赛证书在哪里找 的文章

 

随机推荐