10685 ACMer不得不知道的事儿(一)-----续
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0题型: 编程题 语言: 无限制
Description
如果你完成了10年那题ACMer不得不知道的事儿,请直接跳到描述的最后一段,以下纯属复制粘贴改编: 作为一个入门的ACMer,在参加比赛之前,你势必要了解比赛的一些基本规则,例如一个叫Board的东西。 ACM赛制是8-11道题,5小时,以通过题数的多少以及耗时来排名。比赛的时候有点像赛跑,因为不断有人提交题目,不断有人通过题目,所以,排名是不断变化的。上一秒也许你还是第一名,下一秒也许你就是沙发了,再来可能板凳,甚至刷到看不见你的地方。这也是竞赛的魅力所在,因为可以看到实时排名,所以不光是拼实力,还要拼心理承受能力拼策略等等。有时候看着排名你会觉得鸭梨很大,头脑空白整个人当掉,那就完蛋了(所以Lyd比赛的时候是不看自己的名次的)。但是不看排名呢?好吧,结束后你可能会说:“咦,E题很多人过,刚才没看,是啥题?啊,杀了我吧居然漏了个大水题-_-|||”总之,排名是个很重要的东西,下面我们来了解下。 排名也叫Ranklist,或者Board,通常会显示如下: 1、 按实时名次从高到低,显示所有队伍信息,每支队伍一行。 2、 信息包括过题数、罚时以及各题的提交情况。 3、 提交情况有该题提交次数以及通过时间(如果已通过)。 pc^2(ACM区域赛标准竞赛平台)生成的标准Board类似这样的格式(不完全一致): rank name prosolved totaltime A B C D E 1 Arctic 1 40 1/40 0/- 1/- 1/- 0/- 2 Bumblebee 1 45 1/45 0/- 0/- 0/- 0/- 3 APM1000 1 70 2/50 0/- 0/- 0/- 0/- prosolved是通过的题数,totaltime是罚时,ABCDEFGHIJ是对应题目编号的提交次数/通过时间。 罚时计算如下: 1、 总罚时为每道题目的罚时之和。 2、 每道题目的罚时=通过该题时的时间(即比赛开始了多久通过了该题)+20*该题提交不通过次数。 3、 未通过题目不计罚时。 4、 已通过题目再次提交,无论对错,不计罚时。 对于提交结果,并不是本题的所必须了解的,仍然希望大家有所了解,这对解决所有问题都有所帮助。常见的结果有如下几种: Complie Error (CE) :编译错误,所提交的代码在评测系统中无法编译为可执行程序。比赛中如果出现这种结果,只要不是系统出问题,那绝对要把队友或者被队友拖出去毒打一顿的,属于“ACM五大天啊杀了我吧的理由”之一。当然作为初学者经常会犯这样的错误,例如Ctrl+C的时候复制漏了最后一个花括号啊,该交Java交了GCC啊,将VC代码交到GCC的时候没有将__int64换成long long啊等等。 Runtime Error(RE) :运行时错误,程序在运行中发生错误,导致程序非正常结束(有时候主函数没有return 0;评测系统也会给出RE,因为很多系统会将程序返回值作为程序是否正常退出的判断条件,所以将main定义成int main()并在结束的时候return 0;是个ACMer的好习惯)。造成RE的,一般有整数或者浮点数除0、访问非法内存。除零错误就比较简单了,至于访问非法内存,大概就是数组越界,例如数组开得太小(“ACM五大天啊杀了我吧的理由”之二,Lyd的队长Zjx在训练的时候经常干的事情)但又访问a[10000000]那样,又或者操作空指针,又或者递归层数太多导致函数爆栈(递归层数和运行机器默认的栈空间大小以及函数形参的个数有关,当然通常1w层是有的)。 Memory Limit Exceeded(MLE) :超内存,程序运行时占用内存多于题目规定可以使用的内存。可见明显数组也不是开得越大越好,一般来讲五百万的int数组是毫无鸭梨的,更多的话就要看题目所限的内存是多少。 Output Limit Exceeded(OLE) :输出超限制,程序运行时输出过多内容,远远超出标准答案所需要的长度,并且超出评测系统所限制的内容长度。经典的bug是调试代码的时候,在代码里加了printf语句显示一些中间结果等神马信息,然后提交的时候忘了删掉。。。这杯具绝对是“ACM五大天啊杀了我吧的理由”之三。 Time limit Exceeded(TLE) :超时,程序在规定时间内未能结束,这时评测系统会将程序强行结束,并返回TLE。超时有两种,写烂了和想烂了。不同人写的代码都是很大差别的,有些人显得特别快,很大程度上是因为某些代码上的差异,例如i++和i+=1时间上就有差别,只不过如果代码里少量用的话是体现不出来的,除此之外有很多经验上的优化以及良好的代码习惯,就是大家所需要慢慢养成的了。 如果你自认为没写烂了代码,那么很大可能是想烂了,也就是算法不对,或者说算法效率低,解决的办法便是好好再想想。 Wrong Answer(WA) :错误,程序输出与标准答案不一致。这个结果最复杂,各种诡异都有,也是最为常见的错误。你所要做的,就是从想法到算法再到代码实现,都扫过一遍,看看其中有没有bug,又有啥边界条件没考虑到,如果找到一些可以让你程序WA的数据什么的最好了。如果找了很久都发现不到有什么问题,那么恭喜,很有可能你错在了一个很不起眼的地方,而且找到了会让你抓狂,例如Lyd处于无脑状态下会将循环里面的某些i写成j或者j写成i(“ACM五大天啊杀了我吧的理由”之四)而被队友给予严重BS。 Presentation Error(PE) :格式错误,程序输出与标准答案一致,但格式不对。如果你得到的是这个结果,那么恭喜,你离通过该题不远了,同时,麻烦站墙角面壁三分钟去。通常这类错误会在你没注意题目要求结果漏了在两组数据的输出之间输出空行或者输出多了空格或者空行的时候出现,毫无疑问“ACM五大天啊杀了我吧的理由”之五。 Accepted (AC) :通过,熬夜到四点切了这题,这辈子值了-_-||| (没事别乱熬夜T_T) 现在给你一个比赛结束时的Board(ACM比赛时长5个小时,所以就是第300分钟时候的Board),然后问你第k分钟的时候的Board是怎样的。
Input
第一行,一个数T,表明有多少组数据 第二行到结束,是T组数据,对于每组数据: 第一行是两个整数n(n<600)和m,表示有n支队伍,和m次询问 接下来是n+1行数据,一行标题(题目编号用A-Z表示)和n行排名 然后是m行每行一个数q(0<=q<=300),表示问你第k分钟的Board是怎样的。
Output
对于每次询问,输出n+1行: 第一行是标题 第2到n+1行是排名 PS: 1、当无法确定提交情况的时候,请输出?/- , 例如比赛中某道题错了一次,但你并不知道它什么时候错的。 2、所有代码的提交时间都是以分钟为单位,且在[1,300]的整数。 3、罚时相同的话,队名用strcmp比较字典序,"A"排在"B"之前。
Sample Input
13 2rank name prosolved totaltime A B C D E1 Arctic 1 40 1/40 0/- 1/- 1/- 0/-2 Bumblebee 1 45 1/45 0/- 0/- 0/- 0/-3 APM1000 1 70 2/50 0/- 0/- 0/- 0/-4080
Sample Output
rank name prosolved totaltime A B C D E1 Arctic 1 40 1/40 0/- ?/- ?/- 0/-2 APM1000 0 0 ?/- 0/- 0/- 0/- 0/-3 Bumblebee 0 0 0/- 0/- 0/- 0/- 0/-rank name prosolved totaltime A B C D E1 Arctic 1 40 1/40 0/- ?/- ?/- 0/-2 Bumblebee 1 45 1/45 0/- 0/- 0/- 0/-3 APM1000 1 70 2/50 0/- 0/- 0/- 0/-
Hint
thx xym 出的数据,踩到坑的师弟爬出来后记得不要找我报仇,找他~
Source
Lyd
Provider
a470086609
// level: Mess// Classify:basic sort link // Verdict: Accepted [one time] // Run Time: 108ms// Run memory : 2420k // Submission Date: 2012-12-06 22:49:55.077 // My ID: 201131000813 // Usetime:2 hours// [解题思路] 参照 ACMer不得不知道的事儿(一)#include#include #include typedef struct Question{ char name; // 题名 int Submit; // 提交次数 int AC; // 通过的次数 }Question;typedef struct team{ char name[50]; int ACtotal; // 作对的题数 int usetime; // 总罚时 Question AllQuestion[12]; // 每道题的情况 }team;char line[1000]; // 存储输入 << 一行标题(题目编号用A-Z表示)和n行排名 team queue[300], atqueue[300]; // queue数组存储一开始输入的board,atqueue存储指定时间时的board int Load(int rank[], int n, int m, char alphabet[], int moment){//输出board的操作 int i, j, count = 0; printf("rank name prosolved totaltime"); for(i=0; i<=m; ++i) printf(" %c", alphabet[i]); printf("\n"); for(i=0; i n) { atqueue[i].ACtotal = atqueue[i].ACtotal - 1; atqueue[i].usetime = atqueue[i].usetime - queue[i].AllQuestion[j].AC; atqueue[i].AllQuestion[j].Submit = queue[i].AllQuestion[j].Submit - 1; if(atqueue[i].AllQuestion[j].Submit != 0) atqueue[i].usetime = atqueue[i].usetime - 20*atqueue[i].AllQuestion[j].Submit; } else if(queue[i].AllQuestion[j].Submit != 0) { atqueue[i].AllQuestion[j].AC = queue[i].AllQuestion[j].AC; atqueue[i].AllQuestion[j].Submit = queue[i].AllQuestion[j].Submit; } } return 0;}int main(){ int T, i, j, l, p, q, t, n, m, len, k, cnt = 0, rank[300], part1, part2, part3, part4, temp, loc; char *alphabet = "ABCDEFGHIJKL", alpha; int moment, h; scanf("%d", &T); while(T--) { cnt = 0; delectq(queue); //清空队伍的信息 scanf("%d%d", &n, &m); // n支队伍,m次询问 getchar(); memset(line, '\0', sizeof(line)); fgets(line, 1000, stdin); len = length(line); alpha = line[len-2]; loc = strchr(alphabet, alpha) - alphabet; // /题数量 for(i=0; i atqueue[rank[k]].usetime) { temp = rank[j]; rank[j] = rank[k]; rank[k] = temp; } }//for k } for(part3=part4=l=part1; l 0) { temp = rank[p]; rank[p] = rank[p+1]; rank[p+1] = temp; } } part3 = part4 = l+1; }//else }//part3 part1 = part2 = i+1; }//part2结束时间排序中不相等时的程序 }//for Load(rank, n, loc, alphabet, moment); }// m }// T return 0;}// main
Preview Code
// AC时为进行修改的代码 #include#include #include typedef struct Question{ char name; //题名 int Submit; //提交次数 int AC; //通过的次数 }Question;typedef struct team{ char name[50]; int ACtotal; //作对的题数 int usetime; //总罚时 Question AllQuestion[12]; //每道题的情况 }team;char line[1000]; team queue[300], atqueue[300];/*int load(team * temp, int n, int sum){ int i, j; for(i=0; i n) { atqueue[i].ACtotal = atqueue[i].ACtotal - 1; atqueue[i].usetime = atqueue[i].usetime - queue[i].AllQuestion[j].AC; atqueue[i].AllQuestion[j].Submit = queue[i].AllQuestion[j].Submit - 1; if(atqueue[i].AllQuestion[j].Submit != 0) atqueue[i].usetime = atqueue[i].usetime - 20*atqueue[i].AllQuestion[j].Submit; } else if(queue[i].AllQuestion[j].Submit != 0) { atqueue[i].AllQuestion[j].AC = queue[i].AllQuestion[j].AC; atqueue[i].AllQuestion[j].Submit = queue[i].AllQuestion[j].Submit; } } return 0;}int main(){ int T, i, j, l, p, q, t, n, m, len, k, cnt = 0, rank[300], part1, part2, part3, part4, temp, loc; //n支队伍 m道题 k条记录 char *alphabet = "ABCDEFGHIJKL", alpha; int moment, h; scanf("%d", &T); while(T--) { cnt = 0; delectq(queue); //清空队伍的信息 scanf("%d%d", &n, &m); // n支队伍,m次询问 getchar(); memset(line, '\0', sizeof(line)); fgets(line, 1000, stdin); len = length(line); alpha = line[len-2]; loc = strchr(alphabet, alpha) - alphabet; // /题数量 for(i=0; i atqueue[rank[k]].usetime) { temp = rank[j]; rank[j] = rank[k]; rank[k] = temp; } }//for k } for(part3=part4=l=part1; l 0) { temp = rank[p]; rank[p] = rank[p+1]; rank[p+1] = temp; } } part3 = part4 = l+1; }//else }//part3 part1 = part2 = i+1; }//part2结束时间排序中不相等时的程序 }//for // ################# Load(rank, n, loc, alphabet, moment); } } return 0;}