本文介绍了算法竞赛中的三种常见赛制,题目形式,并以实例说明了如何处理最常见的多组数据输入输出问题。
目前的算法竞赛通常使用三种赛制,即ACM赛制、OI赛制以及IOI赛制。要方便理解这三种赛制,我们可以把每种赛制分为提交反馈和计分方式两方面来区分。下面将具体说明三种赛制的规则以及相应的比赛。
提交反馈:ACM赛制的比赛在选手每次提交后都会反馈结果,反馈结果有如下7 种:
1、Accepted. ——通过!(AC)
2、Wrong Answer.——答案错。(WA)
3、Runtime Error.——程序运行出错,意外终止等。(RE)
4、Time Limit Exceeded. ——超时。程序没在规定时间内出答案。(TLE)
5、Presentation Error. ——格式错。程序没按规定的格式输出答案。(PE)
6、Memory Limit Exceeded. ——超内存。程序没在规定空间内出答案。(MLE)
7、Compile Error. ——编译错。程序编译不过。(CE)
ACM赛制下必须通过所有测试样例才算通过,虽然选手能看到程序运行的反馈结果,但无法了解具体测试样例的情况,每道题的提交次数不限制,直到通过为止。需要注意的是提交不通过会有罚时(一般一次错误提交罚时20min)。;另外,ACM赛制的比赛中选手可以看到实时排行榜,针对排行榜上的通过情况来规划自己的做题顺序是每个ACM选手必须学会的技巧(你要是榜一dalao推土机做题当我没说)。
计分方式:先看通过题数,在通过题目数量相等的情况下最终按照答题时间+罚时来排名。
常见比赛:ICPC、CCPC、codeforces比赛、leetcode周赛及全国编程大赛、牛客小白赛练习赛挑战赛、传智杯。
提交反馈:OI赛制下提交题目将不会得到反馈。提交错误也不会有任何惩罚,仅以最后一次提交为准。在比赛过程中也无法看到过题情况与排行榜。
计分方式:每道题有多个测试点,通过一个测试点可以得到相应的分数,赛后按照总得分来排名
常见比赛:NOI全国青少年信息学奥林匹克竞赛、CCF CSP、考研机试、蓝桥杯、牛客OI赛、全国高校计算机能力挑战赛。
提交反馈:IOI赛制可以看做结合了OI赛制和ACM赛制的特点,在提交反馈方面与ACM赛制一致,即可以得到上述的7种反馈结果。甚至可以随时看到此时自己已获得的分数与排行榜的具体情况。如果提交错误也没有任何惩罚,仅以最后一次提交为准。
计分方式:每道题有多个测试点,通过一个测试点可以得到相应的分数,赛后按照总得分来排名,简而言之,IOI赛制就是兼具ACM赛制的提交反馈与OI赛制的计分方式。
常见比赛:PAT、团体程序设计天梯赛、CCF CCSP、洛谷月赛。
一道完整的题目应包含题目描述(Description),输入形式(Input),输出形式(Output),输入样例(Sample Input),输出样例(Sample Output)以及更多信息(More Information)六个部分,各个部分包含的内容如下:
题目描述(Description):题目的背景,某个概念的解释、定义,操作方法的说明等。
输入形式(Input):规定题目的输入格式,一般会精确到每个输入说明,以确保不会有歧义。如果一道题将包含多组样例输入输出,也会在此部分说明。
例:输入的第一行包含一个正整数t(1≤t≤100000),代表此样例有t组数据。
接下来的t行,每行包含两个用空格隔开的正整数n,m(1≤n,m≤100000),分别代表xxxxx和xxxxx。
输出形式(Output):规定题目的输入格式,与输入形式类似,一般会精确到每个输入说明,以确保不会有歧义。注意:一定要严格按照格式输出,不要输出诸如“程序的结果是”、编号等画蛇添足的内容,同时注意大小写!
例:对于每个测试用例,第一行输出“YES”或“NO”(不包含引号),表示xxxxx,如果结果为“YES”,在第二行输出xxxxx。
输入样例(Sample Input):一组满足题目要求的输入。
输出样例(Sample Output):上述输入样例的正确输出结果,有的题目会将样例数据作为第一组评测样例,也就是说自测样例通过即可拿到相应的分数。
更多信息(More Information):有的题目会在此部分做数据范围的说明(如蓝桥杯赛题),有的题目会在此部分对输入样例和输出样例进行说明(如Codeforces题目)。
下面将以学校OJ上的1001题,介绍最常见的多组样例输入输出写法。
标程如下:
#include
using namespace std;
int main()
{
int t;
cin >> t;
while(t --)
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
可以看到,面对多组样例输入,在确定输入组数的情况下,我们可以用while(t --)的方式来确定程序运行的次数,从而达到控制输入输出的目的。注意输出要求,别忘记换行!