本文章写于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<= then
begin
zhi:=false;
exit;
end;
for i:= to trunc(sqrt(a)) do
if a mod i= then
begin
zhi:=false;
exit;
end;
zhi:=true;
end;
procedure init;
var
i :longint;
ch :char;
begin
readln(st);
minn:=maxlongint;
maxn:=;
for i:= 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]>)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('');
end;
end;
begin
assign(input,'word.in'); reset(input);
assign(output,'word.out'); rewrite(output);
init;
clo;
end.

2. 火柴棒等式
(matches.pas/c/cpp)

【问题描述】
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。
注意:
1. 加号与等号各自需要两根火柴棍,拼出0-9各需6,2,5,5,4,5,6,3,7,6根火柴
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
【输入】
输入文件matches.in共一行,又一个整数n(n<=24)。
【输出】
输出文件matches.out共一行,表示能拼成的不同等式的数目。
【输入输出样例1】
matches.in
14
matches.out
2
【输入输出样例1解释】
2个等式为0+1=1和1+0=1。
【输入输出样例2】
matches.in
18
matches.out
9
【输入输出样例2解释】
9个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11

解题报告

一道交表题,先写出一个枚举的程序,分别计算出输入1~24时的结果。填写等式a+b=c,枚举a、b的值,再看a+b,a,b所消耗的火柴数+4是否等于所给火柴数即可。不难发现a,b最大不会超过1111,先算出a<b的情况总数,乘以2得a>b,a<b的情况总数,再算出a=b的情况总数,相加得出结果。
第一个搜索程序如下:

program matches;
const
maxx =;
num :array[..]of longint=(,,,,,,,,,);
var
n :longint;
procedure clo;
begin
close(input);
close(output);
end;
function plus(a:longint):longint;
begin
plus:=;
if a= then
begin
plus:=num[];
exit;
end;
while a> do
begin
plus:=plus+num[a mod ];
a:=a div ;
end;
end;
procedure work;
var
i,j,a,b,tot :longint;
begin
tot:=;
for i:= to maxx do
for j:= to i- do
if plus(i)+plus(j)+plus(i+j)=n then inc(tot);
tot:=tot*;
for i:= to maxx do
if plus(i)*+plus(i*)=n then inc(tot);
writeln(' ans[',n+,']:=',tot,';');
end;
begin
assign(input,'matches.in'); reset(input);
assign(output,'matches.out'); rewrite(output);
for n:= to do work;
clo;
end.

最终程序如下:

program matches;
const
maxn =;
var
ans :array[..maxn]of longint;
n :longint;
procedure clo;
begin
close(input);
close(output);
end;
begin
assign(input,'matches.in'); reset(input);
assign(output,'matches.out'); rewrite(output);
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
ans[]:=;
readln(n);
writeln(ans[n]);
clo;
end.

3. 传纸条
(wassage.pas/c/cpp)

【问题描述】
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。
【输入】
输入文件message.in的第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1<=m,n<=50)。
接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。每行的n个整数之间用空格隔开。
【输出】
输出文件message.out共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。
【输入输出样例】
message.in
3 3
0 3 9
2 8 5
5 7 0
message.out
34
【限制】
30%的数据满足:1<=m,n<=10
100%的数据满足:1<=m,n<=50

解题报告

动态规划,我们可以将其视为一个路径问题,从左上角到右下角找两条不相交路线。f[step,x1,x2]表示从左上角两条路各走了step步后,上面一条路走到第x1行,下面一条路走到第x2行,此时的最大好心值。根据step和x可以算出y(走到第几列),y=step-x+2。
最外层枚举step,里层枚举x1,x2。对于每个f[step,x1,x2]有四种情况,这两条路线的上一步从上来还是从左来,
即:
f[step-1,x1-1,x2-1]+map[x1,y1]+map[x2,y2],
f[step-1,x1,x2-1]+map[x1,y1]+map[x2,y2],
f[step-1,x1,x2]+map[x1,y1]+map[x2,y2],
f[step-1,x1-1,x2] +map[x1,y1]+map[x2,y2]。
最后f[n+m-3,n-1,n]即为所求。

program message;
const
maxn =;
var
n,m :longint;
map :array[..maxn,..maxn]of longint;
f :array[..maxn*,..maxn,..maxn]of longint;
procedure clo;
begin
close(input);
close(output);
end;
function max(a,b:longint):longint;
begin
if a>b then max:=a else max:=b;
end;
procedure init;
var
i,j :longint;
begin
readln(n,m);
for i:= to n do
begin
for j:= to m do read(map);
readln;
end;
end;
procedure work;
var
step,x1,x2,y1,y2:longint;
xm :longint;
begin
for step:= to m+n- do
begin
if step+<=n then xm:=step+ else xm:=n;
for x2:= to xm do
for x1:= to x2- do
begin
y1:=step-x1+;
y2:=step-x2+;
f[step,x1,x2]:=max(f[step-,x1-,x2-],max(f[step-,x1,x2-],max(f[step-,x1,x2],f[step-,x1-,x2])));
f[step,x1,x2]:=f[step,x1,x2]+map[x1,y1]+map[x2,y2];
end;
end;
writeln(f[n+m-,n-,n]);
end;
begin
assign(input,'message.in'); reset(input);
assign(output,'message.out'); rewrite(output);
init;
work;
clo;
end.

4. 双栈排序
(twostack.pas/c/cpp)

【问题描述】
Tom最近在研究一个有趣的排序问题。如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序。
操作a
如果输入序列不为空,将第一个元素压入栈S1
操作b
如果栈S1不为空,将S1栈顶元素弹出至输出序列
操作c
如果输入序列不为空,将第一个元素压入栈S2
操作d
如果栈S2不为空,将S2栈顶元素弹出至输出序列
如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”。例如(1,3,2,4)就是一个“可双栈排序序列”,而(2,3,4,1)不是。下图描述了一个将(1,3,2,4)排序的操作序列:<a,c,c,b,a,d,d,b>
当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),<a,c,c,b,a,d,d,b>是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。
【输入】
输入文件twostack.in的第一行是一个整数n。
第二行有n个用空格隔开的正整数,构成一个1~n的排列。
【输出】
输出文件twostack.out共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。
【输入输出样例1】
twostack.in
4
1 3 2 4
twostack.out
a b a a b b a b
【输入输出样例2】
twostack.in
4
2 3 4 1
twostack.out
0【输入输出样例3】
twostack.in
3
2 3 1
twostack.out
a c a b b d【限制】
30%的数据满足: n<=10
50%的数据满足: n<=50
100%的数据满足: n<=1000

解题报告

暴力搜索。我介绍的这种算法可得40分。依次尝试a,b,c,d四种做法是否可行。第一组得以实现的解即为所求。

program twostack;
const
maxn =;
var
n,s3 :longint;
s,s1,s2 :array[..maxn]of longint;
ans :array[..maxn*]of longint;
procedure clo;
begin
close(input);
close(output);
halt;
end;
procedure init;
var
i :longint;
begin
readln(n);
if n> then
begin
writeln('');
clo;
end;
for i:=n downto do read(s);
s[]:=n;
readln;
end;
procedure print(a:longint);
var
i :longint;
begin
write(chr(ord('a')-+ans[]));
for i:= to a do
write(' ',chr(ord('a')-+ans));
writeln;
clo;
end;
procedure search(a:longint);
begin
if s3=n then print(a-);
if (s[]>)and((s1[s1[]]>s[s[]])or(s1[]=)) then
begin
inc(s1[]);
s1[s1[]]:=s[s[]];
dec(s[]);
ans[a]:=;
search(a+);
inc(s[]);
s[s[]]:=s1[s1[]];
dec(s1[]);
end;
if (s1[]>)and(s1[s1[]]-s3=) then
begin
inc(s3);
dec(s1[]);
ans[a]:=;
search(a+);
inc(s1[]);
s1[s1[]]:=s3;
dec(s3);
end;
if (s[]>)and((s2[s2[]]>s[s[]])or(s2[]=)) then
begin
inc(s2[]);
s2[s2[]]:=s[s[]];
dec(s[]);
ans[a]:=;
search(a+);
inc(s[]);
s[s[]]:=s2[s2[]];
dec(s2[]);
end;
if (s2[]>)and(s2[s2[]]-s3=) then
begin
inc(s3);
dec(s2[]);
ans[a]:=;
search(a+);
inc(s2[]);
s2[s2[]]:=s3;
dec(s3);
end;
end;
begin
assign(input,'twostack.in'); reset(input);
assign(output,'twostack.out'); rewrite(output);
init;
search();
writeln('');
clo;
end.

告别我的OI生涯的更多相关文章

  1. AFO 我的oi生涯 大结局

    今儿个哥几个一屋子退役了,这两天也许会写一个生涯大结局留作纪念吧. 今天就写了吧. 由于在机房的原因比一般同学获得的知识更多一些.进来总是看新闻,感慨颇多.自从两会开的第一天起,我就对我们政府采取的一 ...

  2. 关于我的OI生涯(AFO){NOIP2016 后}

    这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...

  3. OI生涯回忆录 2018.11.12~2019.4.15

    上一篇:OI生涯回忆录 2017.9.10~2018.11.11 一次逆风而行的成功,是什么都无法代替的 ………… 历经艰难 我还在走着 一 NOIP之后,全机房开始了省选知识的自学. 动态DP,LC ...

  4. OI生涯回忆录 2017.9.10~2018.11.11

    然而并没有退役 为了这两天,也准备了一年. 高一零基础的蒟蒻,NOIP2017仅有80pts 之后看着luogu的倒计时, 300天,200天,100天,30天, 直到10天.1天. 10号,11号的 ...

  5. 我的OI生涯 第七章 终篇

    11.10日. 我们TSOI再次来到了熟悉的燕山大学,只不过这次是真刀真枪的干了. 望着那座熟悉的小桥,身边的好友不知此行过后还有多少. 下午才到,出人意外的是这次没有住燕大宾馆而是选择了熟悉的格林豪 ...

  6. 我的OI生涯 第六章

    开学了,但是我们并没有像一个正常的高二学生一样坐在教室里接受调研考试的洗礼. 暑假作业这种东西早已被甩在一旁,可以想象回去补文化课时该有多么狼狈. 大王给我们制定了周密的计划,每周两次测试,加上蔡老师 ...

  7. 我的OI生涯 第五章

    我的OI生涯 第五章 千古诗才,蓬莱文章建安骨 一身傲骨,青莲居士谪仙人 李白追月逆江河 包黑斩龙顺民心 豪气压群雄,能使力士脱靴,贵妃捧砚; 仙才媲众美,不让参军俊逸,开府清新 我辈此中惟饮酒 先生 ...

  8. OI生涯回忆录(一)

    OI生涯彻底结束了(难道不是早就结束了),有些东西不写可能就忘了,还是记录一下一些回忆叭.比较墨迹所以可能就连载了. (一)高一开学到NOIP2016 最开始就是觉得信息(计算机)竞赛可能会很有意思就 ...

  9. OI生涯回顾

    OI回忆录只是一个预告,估计等2020高考结束才放出来吧. 先写一下自己简单的OI历程吧: 小升初刚起步 初一 第一次比赛,NOIP PJ组215分,踩线1=,全省rk86,全国rk677(毕竟AH ...

随机推荐

  1. Linux进程管理子系统分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...

  2. Windows 2008 IIS7.5中创建独立账号的FTP站点图文教程

    Windows 2008上的IIS7.5,FTP功能已经非常强大了,完全不下于Serv-U这样的第三方软件.本文小编就介绍在IIS7.5上配置独立账号的FTP站点. 1.创建Windows账号 右击点 ...

  3. [转]Java线程安全总结

    最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...

  4. 关于StrangeIOC框架

    在Unity上进行开发,请先看对其开发模式应用的讨论: http://www.reddit.com/r/Unity3D/comments/1nb06h/unity_design_patterns_an ...

  5. iOS --- DIY文件名批量修改

    批量修改文件名: // 1.创建文件管理 NSFileManager *filemanager =[NSFileManager defaultManager]; // 2. 获得所有文件夹路径 NSS ...

  6. Webpack 中文指南

    来源于:http://webpackdoc.com/index.html Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资 ...

  7. [转]Ext ComboBox 默认选中某一项

    原文地址:http://blog.csdn.net/liuguxing/article/details/8623190 项目中经常用到选择框,需要从后台异步加载数据,可单独写一个组件进行加载 App. ...

  8. 【PHP】月末・月初の出力方法

    文章出处 : Qiita - http://qiita.com/shoridevel/items/0a2f4a64e55d84919a1c 今月の月初 echo date("Y-m-01&q ...

  9. yii 核心类classes.php详解(持续更新中...)

    classes.php在yii运行的时候将被自动加载,位于yii2文件夹底下. <?php /** * Yii core class map. * * This file is automati ...

  10. Ruby升级的最新方法

    今天安装cocoapods时候出现了下面的提示Error installing pods:active support requires Ruby version >= 2.2.0这个需求的意思 ...