本文章写于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.
View Code

相关文章: