“天梯赛”的竞赛题目一共有 15 道,分为 3 个梯级:
基础级设 8 道题,其中 5 分、10 分、15 分、20 分的题各 2 道,满分为 100 分;题目编号相应为L1-X
,X
取1,2,3,4,5,6,7,8,分别表示基础级的8道题,如L1-1
表示基础级的第1题。
进阶级设 4 道题,每道题 25 分,满分为 100 分;题目编号相应为L2-X
,X
取1,2,3,4,分别表示进阶级的4道题,如L2-2
表示进阶级的第2题。
登顶级设 3 道题,每道题 30 分,满分为 90 分。题目编号相应为L3-X
,X
取1,2,3,分别表示登顶级的3道题,如L3-2
表示登顶级的第2题。
注:若对以上表述仍有不理解或者不清楚的,则请参考本套考题的题号与分值。
在我们校赛中,积分规则和正式天梯赛积分规则有些许不同,校赛的积分规则简化后如下:
- 参赛者须独立按照严格的输入输出要求提交每一题的解题程序。程序须经过若干测试用例的测试,每个测试用例分配一定分数。每题的得分为通过的测试用例得分之和;整场比赛得分为各题得分之和。程序可反复提交,取最高分,提交错误不扣分。
- 参赛者的个人总分由每题得分和先锋奖励组成。只有当该队员的基础题总分超过 60 分时,其进阶部分的题目分数(包括奖励)才被判为对其个人有效;当其进
阶题总分超过 25 分时,其登顶部分的题目分数(包括奖励)才被判为对其个人有效。
- 当一支参赛团队的基础题总分超过 300 分时,该队进阶部分的题目分数才被判为对团队有效;只有当其进阶题总分超过 125 分时,该队登顶部分的题目分数才被判为对团队有效。
- 校赛中每个参赛团队由5名参赛者组成。
注:基础题是默认有效的。对个人/团队无效得分的部分视为0分。
团队的基础题总分为所有队员在基础题的得分总和;
团队的进阶题总分为所有队员在进阶题的得分总和;
团队的登顶题总分为所有队员在登顶题的得分总和。
当队员在进阶题或登顶题的得分对个人来说是无效时,但是这部分仍然计入团队进阶题和登顶题得分,只有当团队基础题得分/进阶题得分达到了进阶条件,团队的进阶题得分/登顶题得分才能被判定为对团队有效。
在竞赛的过程中你和你的队友都如此沉迷,以至于你们都忘记看实时榜单,比赛结束后你们只能通过提交记录计算你们团队每个人的得分以及团队总得分。具有团队精神的你想要亲自编写程序来解决这个问题。
-
天梯赛是善良的,同一道题你可以多次提交,该题最终得分为多次提交的最高分(参考样例1)。
-
若有些题没有提交记录,即该题记做0分。
同样因为一股神秘力量(可能来自参赛团队本身 只有自己团队的提交记录),本题不考虑先锋奖励。
输入格式:
输入第一行给出一个非负整数N
(0<=N
<200),表示提交记录的数量。
接下来N
行,每行给出一条提交记录的详细情况,其格式为:队员编号 题目编号 分数
。你们队员的编号依次为1,2,3,4,5
。
题目保证所有的提交记录只有你们团队的记录,不会出现其他队伍的记录;同时,同一道题可能有多次提交。
输出格式:
一共输出6行。
第1行输出团队总得分。
接下来5行输出团队5个人每个人的成绩,按总分由高到低的顺序。若总分相同,则优先输出编号较小者。
输入样例1:
5
1 L1-1 5
1 L1-1 3
1 L1-1 4
1 L1-1 2
1 L1-1 1
输出样例1:
5
1 5
2 0
3 0
4 0
5 0
输入样例2:
22
1 L1-8 20
1 L1-7 20
1 L1-6 15
1 L1-5 15
2 L1-8 20
2 L1-7 20
2 L1-6 15
2 L1-5 15
3 L1-8 20
3 L1-6 15
3 L1-5 15
4 L1-8 20
4 L1-7 20
4 L1-6 15
4 L1-5 15
4 L1-4 10
4 L1-3 10
1 L1-4 10
1 L1-3 10
1 L1-2 5
5 L2-1 25
5 L2-2 25
输出样例2:
355
1 95
4 90
2 70
3 50
5 0
样例解释2:
5号队员虽然进阶题得到50分,但是他基础题得分为0,所以,对于5号队员个人来说,他的最后总得分为0;对于整个团队来说,团队的基础题部分得分为305,达到了进阶条件;5号选手在进阶部分的得分可以计入团队的进阶部分得分,所以团队最后的总得分为355。接下来请继续你的快乐作答!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int per_basic[6][9];//个人_基础题
int per_meddle[6][5];//个人_进阶题
int per_advanced[6][4];//个人_登顶题
int team_mark = 0;//团队_总分
int per_summark[6][2];//个人_总分
struct node {
int stu_number;
char ques[10];
int ques_mark;
};
//所有成绩置零
void Zero_setting(void)
{
int i;
int j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 9; j++)
{
per_basic[i][j] = 0;
}
for (j = 0; j < 5; j++)
{
per_meddle[i][j] = 0;
}
for (j = 0; j < 4; j++)
{
per_advanced[i][j] = 0;
}
for (j = 0; j < 2; j++)
{
per_summark[i][j] = 0;
}
}
}
//成绩更新
int Refresh(struct node node)
{
int flag = 0;//判断此次是否进行了成绩更新
int i;
int j;
int stu_number;//学生_序号
int ques_rank;//问题_等级
int ques_number;//问题_序号
int ques_mark;//问题_成绩
stu_number = node.stu_number;
ques_mark = node.ques_mark;
ques_rank = node.ques[1] - '0';
ques_number = node.ques[3] - '0';
//判断 问题__等级
if (ques_rank == 1)
{
if (ques_mark > per_basic[stu_number][ques_number])//判断更新分数是否大于原分数
{
per_basic[stu_number][ques_number] = ques_mark;
flag = 1;
}
}
else if (ques_rank == 2)
{
if (ques_mark > per_meddle[stu_number][ques_number])
{
per_meddle[stu_number][ques_number] = ques_mark;
flag = 1;
}
}
else if (ques_rank == 3)
{
if (ques_mark > per_advanced[stu_number][ques_number])
{
per_advanced[stu_number][ques_number] = ques_mark;
flag = 1;
}
}
return flag;//返回此次是否更新
}
//计算队伍总成绩并输出
void Total_print(void)
{
int i;
int j;
int team_basic = 0;//团队_基础题
int team_meddle = 0;//团队_进阶题
int team_advanced = 0;//团队_登顶题
//求团队的三种题目分数
for (i = 1; i < 6; i++)
{
for (j = 1; j < 9; j++)
{
team_basic += per_basic[i][j];
}
}
for (i = 1; i < 6; i++)
{
for (j = 1; j < 5; j++)
{
team_meddle += per_meddle[i][j];
}
}
for (i = 1; i < 6; i++)
{
for (j = 1; j < 4; j++)
{
team_advanced += per_advanced[i][j];
}
}
//判断进阶题和登顶题是否分数有效,再求和等于团队总分
if (team_basic < 300)
{
team_meddle = 0;
}
if (team_meddle < 125)
{
team_advanced = 0;
}
team_mark = team_basic + team_meddle + team_advanced;
//输出团队总分
printf("%d\n", team_mark);
}
//计算个人总成绩并输出
void Per_print(void)
{
int i;
int j;
int per_basic_sum[6];//个人_基础题_总分
int per_meddle_sum[6];//个人_进阶题_总分
int per_advanced_sum[6];//个人_登顶题_总分
int per_summark_print[6][2];//个人_总分_输出([i][0]为序号,[i][1]为成绩)
//置零
for (i = 0; i < 6; i++)
{
per_basic_sum[i] = 0;
per_meddle_sum[i] = 0;
per_advanced_sum[i] = 0;
}
//计算每个学生的三种题目总分
for (i = 1; i < 6; i++)
{
for (j = 1; j < 9; j++)
{
per_basic_sum[i] += per_basic[i][j];
}
for (j = 1; j < 5; j++)
{
per_meddle_sum[i] += per_meddle[i][j];
}
for (j = 1; j < 4; j++)
{
per_advanced_sum[i] += per_advanced[i][j];
}
}
//判断学生个人进阶题和登顶题分数是否有效
for (i = 1; i < 6; i++)
{
if (per_basic_sum[i] < 60)
{
per_meddle_sum[i] = 0;
}
if (per_meddle_sum[i] < 25)
{
per_advanced_sum[i] = 0;
}
}
//计算学生个人成绩对应学号存入per_summark以及per_summark_print
for (i = 1; i < 6; i++)
{
per_summark[i][0] = i;
per_summark[i][1] = per_basic_sum[i] + per_meddle_sum[i] + per_advanced_sum[i];
per_summark_print[i][0] = per_summark[i][0];
per_summark_print[i][1] = per_summark[i][1];
}
//对per_summark_print进行排序,冒泡排序,稳定
for (i = 1; i < 6; i++)
{
for (j = 1; j < 6 - i; j++)
{
if (per_summark_print[j][1] < per_summark_print[j + 1][1])
{
int temp = per_summark_print[j][1];
per_summark_print[j][1] = per_summark_print[j + 1][1];
per_summark_print[j + 1][1] = temp;
int temp1 = per_summark_print[j][0];
per_summark_print[j][0] = per_summark_print[j + 1][0];
per_summark_print[j + 1][0] = temp1;
}
}
}
//按题目要求输出个人成绩
for (i = 1; i < 6; i++)
{
if (i == 5)
printf("%d %d", per_summark_print[i][0], per_summark_print[i][1]);
else
printf("%d %d\n", per_summark_print[i][0], per_summark_print[i][1]);
}
return;
}
int main(void)
{
int n;
struct node node;
Zero_setting();
scanf("%d", &n);
while (n--)
{
scanf("%d %s %d", &node.stu_number, node.ques, &node.ques_mark);
Refresh(node);
}
Total_print();
Per_print();
return 0;
}