本文章写于2008年12月15日。
随着2008noip的结束,我也结束了我的OI生涯。
信息竞赛也许是从小到大让我最最努力的一件事。我记得参加2006noip初赛前,每天中午为了上信息课都吃不上中午饭,只能吃点面包。然后总算是进了决赛,结果决赛得了个零分。比赛之后开始了新一轮的训练,放学后我经常做题做到11点多都不睡,连我自己都不清楚这么努力的原因,也许是因为兴趣吧。
一年后,2007noip赛前,听说这次一等的名额特别多,我本以为能拿一等,没想到我非常荣幸的以160分的成绩取得了二等奖第一名。这无疑给了我沉痛的打击。然后我决定再学一年,原因不是因为我想保送,也不是因为对竞赛的兴趣,而是因为我感觉没得到一等实在是一种耻辱,再学一年只是为了挽回面子。
这一年的学习比想象中的轻松很多,偶尔还可以看看电影,打打游戏,听听歌什么的。终于2008年的noip到来了,听说这一年的一等名额要照上一年减少很多,这给我带来了很大压力。初赛本来以为可以抄一抄,没想到传过来的答案居然错了一道8分的大题,幸好没有抄。然后我以全省第八的成绩进入了决赛。决赛前的训练是以看电影为主,打游戏为辅,再次才是做题。在决赛中我猜很多人都被往年参赛的经验给害了,我就是其中之一,都以为过了200分基本上就保一等了,所以把大部分时间放在了检查前两道题上,结果08年一等的分数线是250分,很多人与一等失之交臂,我也只是以260分的成绩排在全省第14名,搭了个一等的边。
现在我终于可以踏踏实实的参加学校组织的午睡了,不用每天中午都在微机室里度过。偶尔回忆一下微机室的事情还是觉得挺美好的。
下面把08年的决赛题目和我自己写的解题报告和程序发上来留个纪念。
1. 笨小猴
(word.pas/c/cpp)
【问题描述】
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
【输入】
输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
【输出】
输出文件word.out共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
【输入输出样例1】
word.in
error
word.out
Lucky Word
2
【输入输出样例1解释】
单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。
【输入输出样例2】
word.in
Olympic
word.out
No Answer
0
【输入输出样例2解释】
单词olympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。
解题报告
开一个num数组记录每个字母出现的次数,例如num[‘a’]中记录了字母a在该单词中出现了几次。在读入过程中完成该数组的填写。然后从a到z找一遍,找到maxn(出现最多的字母的出现次数)和minn(出现最少的字母的出现次数),做差判断是不是质数就可以了。
program word; var st :string; num :array['a'..'z']of longint; maxn,minn :longint; procedure clo; begin close(input); close(output); end; function zhi(a:longint):boolean; var i :longint; begin if a<=1 then begin zhi:=false; exit; end; for i:=2 to trunc(sqrt(a)) do if a mod i=0 then begin zhi:=false; exit; end; zhi:=true; end; procedure init; var i :longint; ch :char; begin readln(st); minn:=maxlongint; maxn:=0; for i:=1 to length(st) do inc(num[st]); for ch:='a' to 'z' do begin if num[ch]>maxn then maxn:=num[ch]; if (num[ch]>0)and(num[ch]<minn) then minn:=num[ch]; end; if zhi(maxn-minn) then begin writeln('Lucky Word'); writeln(maxn-minn); end else begin writeln('No Answer'); writeln('0'); end; end; begin assign(input,'word.in'); reset(input); assign(output,'word.out'); rewrite(output); init; clo; end.