您的位置:首页 > 其它

大学程序设计竞赛技术手册

2013-05-12 23:56 225 查看
计算机系统环境介绍

操作系统

比赛使用Ubuntu系统(10.04 http://www.ubuntu.com/)
Ubuntu是一个Linux操作系统。Ubuntu系统在操作上和Windows系统没有很大的差别。

Ubuntu下没有大多数Windows下提供的集成开发环境(IDE),本次比赛提供的选择有codeblocks和eclipse+cdt。你也可以使用文本编辑器如vim、emacs等进行程序编写。

Ubuntu可以按Ctrl+Alt+T进入控制台。系统控制台可能使用的常用命令如下,更多命令请自行搜索:

列出当前目录的内容: ls

执行可执行的文件: ./文件名

进入下一级目录: cd 目录名(一般操作会在用户目录~下进行,执行cd ~便可进入用户目录)

进入上一级目录: cd ..

编译c++程序: g++ 文件名.cpp -o 可执行文件名

编译c程序: gcc 文件名.c -o 可执行文件名 -lm

编译java程序: javac 文件名.java

执行java程序: java 类名

删除文件: rm

复制文件: cp

比较两个文件: diff 文件1 文件2

编译器

比赛使用gcc和sun-java6编译器。gcc是一套由GNU开发的编程语言编译器。他与有些同学通常使用的visual c++编译器可能有些许的差异。使用windows系统的同学可以尝试安装MinGW(http://www.mingw.org/),一个在windows下的GNU编程环境进行熟悉。也可以在各大在线评测网站(如: http://www.spoj.pl/或者http://uva.onlinejudge.org/)中尝试使用gcc编译器提交源代码,查看编译是否成功。
关于64位整数有两个需要注意的问题,第一是在linux gcc下64位整数使用long long声明,而不是VC6.0中的__int64。在使用scanf/printf进行输出输出时,格式控制符应该是%lld而不是%I64d。

IDE和文本编辑器

比赛提供的IDE主要有codeblocks(http://www.codeblocks.org/)和eclipse+cdt(http://www.eclipse.org/和http://www.eclipse.org/cdt/)。想要提前熟悉环境的同学可以提前下载安装尝试。

文本编辑器: vim(http://www.vim.org/), emacs(http://www.gnu.org/software/emacs/)想必不用介绍。

比赛PC^2介绍

比赛使用的程序提交系统是PC^2v9(http://www.ecs.csus.edu/pc2/)。比赛时可以在系统中找到并运行。

运行后会出现登陆界面,输入提供的用户名和密码后即可登陆软件。

PC^2的主要功能有提交程序、查看评测结果和提交有关题目的疑问。

提交程序界面上需要选择提交的题目,在系统中选择对应的程序源代码,和使用的编程语言,然后点击提交按钮(submit)即可。

提交程序以后可以在查看评测状态的界面上找到自己的提交记录。在提交以后裁判会负责运行你的程序并判断你的程序是否正确。你稍后就可以在状态下找到自己程序的评测结果。

在疑问页面中你可以提交自己关于题目描述等的疑问,并且可以查看裁判关于您疑问的回答。

比赛规则介绍

本次比赛的排名方法与ACM-ICPC比赛相同。首先比较队伍之间通过题目的个数,如果过题数相同,则比较各队的罚时。各队的罚时计算是所有通过的题目的第一次通过提交时间的分钟数之和加上所有通过题目的错误提交次数*20。如果仍有并列按照最后一次通过提交的时间,提交时间早者排名靠前。每个队伍通过了一道题还会获得此道题目对应颜色的气球作为奖励。选手还可以在系统中使用浏览器查看当前比赛的实时排名,但是在五个小时的比赛的最后一个小时,比赛排名将停止更新,选手只能通过观察比赛场上的气球状况或者比赛经验来获得一些信息。

比赛中的题目会以英文纸质题目的方式发给各位参赛队员。参赛选手需要在比赛提供的系统中编写能够解决题目中描述的问题。如果提交的源代码编译出的程序可以通过裁判准备的所有测试数据(即对于输入文件都给出了满足题目要求的输出文件,大部分情况是需要和标准的输入文件完全相同)即通过此题。

评测方法介绍

要求程序满足如下条件:

所有输入数据从标准输入(stdin)读入,并且程序向标准输出(stdout)输出题目要求的答案。

所有题目在同一文件中均有多组测试数据,以文件结束符(EOF)结束。测试数据在输出中均需要输出,共有两种输出方法:

Case (TestNo): (Answer)



Case (TestNo): (AnswerLine1)

(AnswerLine2)



(AnswerLineN)

所有试图攻击、破解、窃取比赛系统和裁判数据的行为均将被视为作弊,取消比赛资格并为他的行为付出相应的代价。情节严重者,按照复旦大学考试作弊报请处理。

选手程序需要在一定的时间内运行出正确的结果(一般时间为标准程序的5倍以上,通常不会超过1分钟),否则将会获得超出时间限制(Time Limit Exceeded)的返回结果。如果选手程序在运行时间内崩溃或者返回值不为0,则会获得Run Time Error。

裁判比较标准输入输出和选手程序提供的输出时会忽略多余行末空格。但如果出现任何其他字节错误,如大小写不匹配、小数点后数字位数不够或太多、多余换行等,均被视为错误的答案(Wrong Answer)。

如果选手程序在规定时间内,运行出了满足题目要求的结果,则会获得返回(Yes)。表示选手的程序通过了此题。

一个可能的题目描述会像下面这样:

Given n integers, you task is to sort them in non-decreasing order.

[Input]

Each test case starts with a line containing an integer n (1

[Output]

For each test case, display a single line containing the case number and the input integers in non-decreasing order, separated by single spaces.

[Sample Input]

3

3 2 1

5

-1 5 4 2 3

[Output for Sample Input]

Case 1: 1 2 3

Case 2: -1 2 3 4 5

题目描述总是会分为description, input, output, sample input 和output for sample input 五个部分。description中会给出任务的描述;input中会指明输入的格式以及输入数据的规模。本次比赛中,所有输入都从stdin中读入,每个题目都会有若干组测试数据,以scanf返回EOF作为结束。output中会指明输出的格式,请严格按照输出格式进行输出,不要输出任何多余的字符。Sample Input与Output for Sample Input会给出一些输入输出的例子,用于测试。

对于此题,以下C++程序可以获得Yes的返回:

#include#includeusing namespace std;int n,a[1000000];int main(){ for(int t=1; scanf("%d",&n)!=EOF; t++){ for(int i=0; i

而以下这些程序都不能获得Yes的返回:

#include#includeusing namespace std;int n,a[1000000];int main(){ for(int t=1; scanf("%d",&n)!=EOF; t++){ printf("Please input the numbers\n"); for(int i=0; i

此程序会在标准输出中打出多余的字符,因此会得到No – Wrong Answer的返回。

#include#includeusing namespace std;int n,a[1000000];int main(){ for(int t=1; scanf("%d",&n)!=EOF; t++){ for(int i=0; ia[j])swap(a[i],a[j]); printf("Case %d:",t); for(int i=0; i

此程序虽然能输出正确的结果,但是对于比较大规模(1000000左右的N)的输入,不能在一个可接受的时间(比如,1分钟)之内运行结束,因此,会得到No – Time Limit Exceeded的返回。

#include#includeusing namespace std;int n,a[10];int main(){ for(int t=1; scanf("%d",&n)!=EOF; t++){ for(int i=0; i

此程序在N比较大的时候,由于a数组不够大,会访问到无效的内存地址,因此,会得到No – Run Time Error的返回。

类似的,一个能得到Yes返回的Java程序如下:

import java.io.*;import java.util.*;class Main {public static void main(String args[]) throws IOException {int test = 0;Scanner cin = newScanner(System.in);while(cin.hasNextInt()) { test++;int n = cin.nextInt();int a[] = new int
;for(int i=0; i

文件名为Main.java(注意,此java文件名必须与程序文件中包含main函数的那个类名相同,否则会得到No – Compile Error的返回结果)

最后,一个能得到Yes返回的Pascal程序如下:

procedure sort( var a: array of longint; l:longint; r:longint );var mid, i, j, tmp : longint;beginif l >= r then exit; mid := a[(l+r) div 2]; i := l; j:= r;while i < j dobeginwhile ( a[i] < mid ) do inc(i);while ( a[j] > mid ) do dec(j);if ( i
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: