荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: kaman (天外飛仙), 信区: ACMICPC
标 题: ACM入门指引(一)
发信站: 荔园晨风BBS站 (Fri Mar 17 15:30:55 2006), 站内
校内赛逐渐临近,看了一下前两次周赛的情况,发觉还有不少有兴趣同学
没有领进门来,所以趁有时间,写写比赛要注意的一些东西。
第一篇,就先告诉大家怎样通过一道a+b=?的题目
(老手就不要往下看了)
ACM的题目的输入输出都是严格规范的,如果你输出的就算多一个空格,
也是相当于没有做对这道题目,而得到一个Presentation Error (P.E)
输入的格式没有一定的规范,不过一般都会严格按照题目中的Input的描述。
而ACM的比赛中一般都是多组测试数据的,简单说就是你的程序运行一遍要处理
多组的测试数据。
SZU Online Judge上的题目的Input的格式多是这样的:
测试数据的组数n
第1组测试数据
第2组测试数据
第3组测试数据
.
.
.
第n组测试数据
比如说a+b=?这道题目按照上面说的格式给出这样的测试数据
3
1 2
0 1
10000 99999
你的程序就要先读入n(这里等于3),然后对接下来的n组输入做处理。
一般输入用scanf做格式控制已经足够了,详细怎样用可以请教任何一本
c语言的书。根据题目中Input的描述,n为整数,所以这里可以用
scanf( "%d", &n );
把n读入。接下来就要你的程序自动的处理n组的测试数据,很明显这里
用一个
for( t=0;t<n;t++ ){ }
的循环就行了。这里顺便提一个问题,周赛中发现不少同学喜欢先把输入数据
全读进来再进行处理,例如a+b=?中,就是有人喜欢这样:
int in[MAXTESTCASE][2], n, i; // MAXTESTCASE为最大输入组数
scanf( "%d", &n );
for( i=0;i<n;i++ ) // 把n组测试数据都读到in数组
scanf( "%d%d", &in[i][0], &in[i][1]);
for( i=0;i<n;i++ ) // 输出结果
printf( "%d\n", in[i][0]+in[i][1]);
细心一点就可以发现上面两个for循环是可以合并在一起的:
for( i=0;i<n;i++ ){
scanf( "%d%d", &in[i][0], &in[i][1]);
printf( "%d\n", in[i][0]+in[i][1]);
}
再细心点的同学应该还可以发现其实in数组根本没必要,因为每组测试数据之间
是相互独立的,处理完一组,这组测试数据就没用了,可以覆盖掉,所以
程序完全可以写成这样子:
int a,b; //把in[MAXTESTCASE][2]改成两个变量
for( i=0;i<n;i++ ){
scanf( "%d%d", &a, &b);
printf( "%d\n", a+b);
}
这样程序不仅敲少了不少字母,而且占用的内存是原来的1/n,何乐而不为呢?
其实做多两题你就会发现更多这样做的好处,甚至有时候一组测试数据还没
输入完就要开始处理,以简化程序和获得更好的速度,alec把这称作online处理。
至于Output,就一定要按照题目中Output的描述,多一个或少一个空格都只能等着
评测系统返回个大大的P.E给你。就如a+b=?中,如果Output的描述说
Print a single output line giving the sum of A and B.
你就得一个printf( "%d\n", a+b);完事好了。
不过说到底,输入输出最重要的就是灵活处理,也就是“自己执生”,可以做多点题
积累多点经验。
看完这篇文章就去找几题练练手吧:
Judge 题号 题目名称
http://acm.uva.es/p 100 3n+1
http://192.168.14.237/judge 1001 IMMEDIATE DECODABILITY
http://acm.pku.edu.cn/JudgeOnline 1000 A+BProblem
这篇专讲输入输出的就到这里为止,下一篇转讲比赛规则及相关的东西,
欲知后事如何,请听下回分解了。请啊!
--
抓緊時間把感情的帳單
好好去認認真真一一的清還
為身邊每個人
不要怠慢
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.111.200]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店