ACM/ICPC 计分方式

ACM 国际大学生程序设计竞赛(英语: ACM International Collegiate Programming Contest, ICPC )是由美国电脑协会( ACM )主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过 30 多年的发展,ACM 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。

近年来 ACM/ICPC 在中国国内迅速发展,越来越多的大学建立了 ACM/ICPC 的培训体系,专门培养和训练学生并组建队伍参加比赛。因此 PTA 加入了 ACM/ICPC 的计分方式,为希望开展竞赛培训的学校提供一个网上比赛和做题的平台。

一个 ACM/ICPC 题目集

一个题目集在创建的时候可以选择是否是 ACM/ICPC 题目集,创建之后不可以更改。

目前 ACM/ICPC 题目集只允许添加编程题,一般而言比赛也只含编程题。

判题和排名说明

PTA 使用的规则参考了官方规则

判题

ACM/ICPC 比赛中,参赛者每提交一个程序,比赛中都会实时评测,并且结果将反馈给参赛者。
评测的结果可能是:

  • 答案正确:通过了所有测试点
  • 答案错误:第一个未通过的测试点是结果错误
  • 运行超时:第一个未通过的测试点运行时间超出了规定时限
  • 段错误:程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起

等等,更多错误的解释可以参考 PTA 首页公告里的 FAQ 。

排名

ACM/ICPC 比赛中题目没有分数,选手按过题数量从高到低进行排名,过题数相同时按总用时从小到大进行排名。当这两个都相同时按最后过题的提交时间排名,不过目前尚未实现。

PTA 上对此规则进行了拓展,题目允许存在分数,最终排名按照分数从高到低排名。要实现标准的 ACM 比赛排名,只需要将每道题的分数设置成一样就行了。

总用时的单位为分钟,计算公式为:

总用时 = 过题时间总和 + 总罚时

其中总罚时 = 失败尝试次数 * 20 分钟

一道题的过题时间指的是从比赛开始到在此题上第一次成功的提交经过的时间。

失败尝试次数指在成功做对一道题之前的提交次数,但是不包括编译错误。

总用时也有另外一种等价的计算方法,可以先计算每道通过的题目的用时和罚时,再一起加起来。

封榜规则

ACM/ICPC 比赛中,为了保留悬念,通常在比赛结束前的某个时刻进行封榜,从这时候到宣布排名结果为止,参赛者将无法在排名榜单上看到别人的提交结果,但是可以看到别人封榜后在某个题上进行了尝试。

一般而言一场比赛时长为 5 个小时,封榜时间为比赛结束前 1 小时。

排名页 UI

一个可能的排名页面如下:

图中分别用红黄绿颜色进行了不同的标注:

红色加号表示通过此题,如图 1 和图 2 所示

加号下方的黑色小字表示通过此题的时间(从比赛开始进行计时),图 1 和图 2 中均表示比赛开始后 20 分钟后过题。

加号后面跟着失败的尝试次数,图 1 没有数字,说明第一次提交就通过了,图 2 加号后的 2 表示有两次失败的尝试。

绿色减号表示提交此题,但是仍然没有通过,如图 3 所示

图 3 中绿色的 -1 表示在此题上有一次失败的尝试,并且仍未通过。

绿色数字存在一种特殊情况,如图 4 所示

提交了但是结果为编译错误,由于编译错误不算失败尝试,所以结果会显示为绿色 0 。

黄色数字仅出现在封榜之后,如图 5 所示

如果在封榜后继续提交封榜前没有过的题,结果将不会显示出来,会将封榜后尝试的次数用黄色加号和数字挂在后面,比如图 5 ,表示封榜前有一次失败,封榜后又提交了两次。

注意点

比赛结束后榜单不会自动刷新,需要点一下重建排名才能把封榜的效果去掉。