体育成绩统计 / Score

题目描述 

  正所谓“无体育,不清华”。为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心。然而每到学期期末时,面对海量的原始数据,如何对数据进行处理,得到同学们的体育总评成绩却又成了体育部老师的一大难题。

  对于大一的同学们来说,体育课的总评成绩由五部分组成:体育课专项成绩(满分50分)、长跑测试成绩(满分20分)、“阳光长跑”成绩(满分10分)、体质测试成绩(满分10分)、“大一专项计划”成绩(满分10分)。

  1.体育课专项成绩将由任课体育老师直接给出。

  2.长跑测试成绩将由期末长跑测试确定,其中男生需进行3000米测试,女生需进行1500米测试,具体评分标准为:

20

18

16

14

12

10

8

6

4

2

男生

12’30”

13’00”

13’30”

14’00”

14’30”

15’10”

15’50”

16’30”

17’10”

18’00”

女生

6’40”

6’57”

7’14”

7’31”

7’50”

8’05”

8’20”

8’35”

8’50”

9’00”

  3.“阳光长跑”是通过手机app来记录同学们的课外长跑情况,根据对原始跑步数据进行筛选,得到课外长跑的合法次数,来最终确定此部分的成绩。一条合法的锻炼记录需同时满足:

   1)男生长跑距离3000米以上(包含3000米),女生长跑距离1500米以上(包含1500米);

   2)平均速度(运动距离结束时间开始时间)不慢于2米/秒,且不快于5米/秒;

   3)总暂停时间不得超过4分30秒;

   4)平均步幅(距离/步数)不超过1.5米;

   5)开始时间需与上条合法记录的结束时间间隔6小时以上(包含6小时);

   “阳光长跑”的合法次数与该部分得分的对应如下:

分数

10

9

8

7

6

4

2

次数

>=21

20,19

18,17

16,15,14

13,12,11

10,9,8,7

6,5,4,3

  4.对于体质测试部分,若达到合格标准则得到该部分满分10分,否则该部分不得分。

  5.“大一专项计划”的10分由两部分组成:出勤次数占5分,期末检测占5分。其中出勤次数为“班级训练营”的参加次数和“阳光长跑”的合法次数之和,出勤得分与出勤次数的对应如下:

分数

5

4

3

2

1

次数

>=18

17,16,15

14,13,12

11,10,9

8,7,6

  不难看出,要想准确无误地计算出每个人的体育成绩并不是一件轻松的事,于是体育部的老师找到了正在打模拟赛的你,他将提供所有需要用到的数据,希望你帮他算算清华大一同学的体育总评成绩及等级。

  百分制成绩与等级、绩点对应如下:

等级

A

A-

B+

B

B-

C+

百分制

[95,100]

[90,94]

[85,89]

[80,84]

[77,79]

[73,76]

等级

C

C-

D+

D

F

百分制

[70,72]

[67,69]

[63,66]

[60,62]

[0,59]

输入格式

  输入第一行,包含一个正整数,表示大一年级的学生人数。($n \le 4000$)

  接下来行,每行表示一位学生(按学号字典序给出),各项数据之间用空格隔开,一位学生的数据包括:

   1.一个长度为10的正整数$id$(数据保证不包含前导零),表示第$i$位同学的学号;

   2.一个字符,$M$或$F$,若为$M$表示第$i$位同学为男生,若为$F$则表示第$i$位同学为女生;

   3.一个介于0到50之间的非负整数$ps$,表示第$i$位同学的体育课专项成绩;

   4.一个形如$a'b"$的字符串,表示第$i$位同学的期末长跑测试成绩为$a$分$b$秒($0 \le a,b \le 59$);

   5.一个字符,$P$或$F$,若为$P$示第$i$位同学的体质测试通过,若为$F$则表示第$i$位同学的体质测试没有通过;

   6.一个介于0到5之间的非负整数$fs$,表示第$i$位同学的“大一专项计划”的期末检测成绩;

   7.一个非负整数$cnt$($0 \le cnt \le 100$),表示第$i$位同学参加“班级训练营”的次数。

  接下来一行,包括一个非负整数$m$($m \le 1.5\times10^5$),表示需要筛选的“阳光长跑”数据条数。

  接下来$m$行,每行表示一条需要筛选的“阳光长跑”数据(按开始时间顺序给出),各项之间用空格隔开,一条数据包括:

   1.一个形如$2017MMDD$的字符串,表示第$j$条记录的完成日期;

   2.一个长度为10的正整数$id$(数据保证不包含前导零),表示第$j$条记录的来源学号;

   3.两个形如$hh:mm:ss$的字符串,分别表示第$j$条记录的开始时间和结束时间;

   4.一个精确到小数点后两位的非负浮点数$l$$(0 \le l \le 100)$,表示第$j$条记录的运动距离,单位为千米;

   5.一个形如$a'b"$的字符串,表示第$j$条记录的总暂停时间为$a$分$b$秒($0 \le a,b \le 59$);

   6.一个非负整数,表示第条记录的运动总步数。

  输入格式可参见下发样例文件。

  只有四组数据,全部随机生成

输出格式

  输出文件共包括行。请你按照学号字典序输出每一位同学的学号、百分制总评成绩以及等级。每位同学一行,一行内用空格隔开。

样例输入

1
2015011233 M 34 14'30" P 3 3
8
20170508 2015011233 17:02:33 17:19:33 2.99 0'0" 3333
20170509 2015011233 17:12:15 17:38:46 3.01 2'3" 4300
20170510 2015011233 22:03:06 22:13:08 3.05 0'0" 2772
20170511 2015011233 22:08:05 22:28:13 3.02 5'3" 3775
20170512 2015011233 18:03:12 18:17:56 3.02 0'0" 2001
20170513 2015011233 17:30:23 17:46:08 3.01 0'0" 3020
20170513 2015011233 22:03:34 22:20:08 3.04 2'0" 3058
20170514 2015011233 07:16:22 07:32:34 3.00 0'0" 3244

样例输出

2015011233 59 F

思路

  这似乎就是简单的大模拟,但是非常考码力。

代码

#include <stdio.h>
#define N 5000
#define M 200000
int n,m;
long long num[N];
char is_m[N][2],a;
int score[N],tmp;
int times[N];
int head[N];
int nxt[M],to[M],pre[M];
int idx;
int day[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
struct Node
{
int time,time_end,time_beg;bool is;double lenth;
};
Node node[M];
int find(long long number)
{
int l=1,r=n+1;
while(l<r)
{
int mid=(l+r)>>1;
if(num[mid]>=number) r=mid;
else l=mid+1;
}
return l;
}
void add(int a,int b)
{
nxt[++idx]=head[a];
pre[head[a]]=idx;
head[a]=idx;
to[idx]=b;
}
void check(int ord)
{
int now,many=0,last=0;
for(now=head[ord];nxt[now];now=nxt[now]);
for(;now;now=pre[now])
if(node[to[now]].is==false&&node[to[now]].time_beg-last>=6*3600)
many++,last=node[to[now]].time_end;
if(many>=21) score[ord]+=10;
else if(many>=19) score[ord]+=9;
else if(many>=17) score[ord]+=8;
else if(many>=14) score[ord]+=7;
else if(many>=11) score[ord]+=6;
else if(many>=7) score[ord]+=4;
else if(many>=3) score[ord]+=2;
many+=times[ord];
if(many>=18) score[ord]+=5;
else if(many>=15) score[ord]+=4;
else if(many>=12) score[ord]+=3;
else if(many>=9) score[ord]+=2;
else if(many>=6) score[ord]+=1;
}
int main()
{
freopen("Score.in","r",stdin);
freopen("Score.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int t1,t2;
scanf("%I64d",&num[i]);scanf("%s",is_m[i]);
scanf("%d",&score[i]);
scanf("%d%c",&t1,&a),scanf("%d%c",&t2,&a),scanf("%c",&a);
t1=t1*60+t2;
if(is_m[i][0]=='M')
{
if(t1<=750) score[i]+=20;
else if(t1<=780) score[i]+=18;
else if(t1<=810) score[i]+=16;
else if(t1<=840) score[i]+=14;
else if(t1<=870) score[i]+=12;
else if(t1<=910) score[i]+=10;
else if(t1<=950) score[i]+=8;
else if(t1<=990) score[i]+=6;
else if(t1<=1030) score[i]+=4;
else if(t1<=1080) score[i]+=2;
}
else
{
if(t1<=400) score[i]+=20;
else if(t1<=417) score[i]+=18;
else if(t1<=434) score[i]+=16;
else if(t1<=451) score[i]+=14;
else if(t1<=470) score[i]+=12;
else if(t1<=485) score[i]+=10;
else if(t1<=500) score[i]+=8;
else if(t1<=515) score[i]+=6;
else if(t1<=530) score[i]+=4;
else if(t1<=540) score[i]+=2;
}
scanf("%c",&a);if(a=='P') score[i]+=10;
scanf("%d",&tmp),score[i]+=tmp;
scanf("%d",&times[i]);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
node[i].is=false;
int tmp2=0;long long tmp3;
scanf("%4d",&tmp),scanf("%2d",&tmp);
tmp2=day[tmp-1],scanf("%2d",&tmp),tmp2+=tmp-1;
node[i].time=tmp2*24*3600;
scanf("%I64d",&tmp3),add(tmp=find(tmp3),i);
node[i].time_beg=node[i].time_end=node[i].time;
scanf("%d",&tmp2);node[i].time_beg+=tmp2*3600;
scanf("%c%d",&a,&tmp2);node[i].time_beg+=tmp2*60;
scanf("%c%d",&a,&tmp2);node[i].time_beg+=tmp2;
scanf("%d",&tmp2);node[i].time_end+=tmp2*3600;
scanf("%c%d",&a,&tmp2);node[i].time_end+=tmp2*60;
scanf("%c%d",&a,&tmp2);node[i].time_end+=tmp2;
scanf("%lf",&node[i].lenth);node[i].lenth*=1000;
if(is_m[tmp][0]=='M') {if(node[i].lenth<3000) node[i].is=true;}
if(is_m[tmp][0]=='F') {if(node[i].lenth<1500) node[i].is=true;}
scanf("%d",&tmp2);tmp=tmp2*60;
scanf("%c%d",&a,&tmp2);tmp+=tmp2;
scanf("%c",&a),scanf("%c",&a);
if(tmp>270) node[i].is=true;
scanf("%d",&tmp2);
if(tmp2*3<node[i].lenth*2) node[i].is=true;
if(!(node[i].lenth<=(node[i].time_end-node[i].time_beg)*5
&&node[i].lenth>=(node[i].time_end-node[i].time_beg)*2))
node[i].is=true;
}
for(int i=1;i<=n;i++)
{
check(i);
printf("%I64d %d ",num[i],score[i]);
if(score[i]>=95) printf("A\n");
else if(score[i]>=90) printf("A-\n");
else if(score[i]>=85) printf("B+\n");
else if(score[i]>=80) printf("B\n");
else if(score[i]>=77) printf("B-\n");
else if(score[i]>=73) printf("C+\n");
else if(score[i]>=70) printf("C\n");
else if(score[i]>=67) printf("C-\n");
else if(score[i]>=63) printf("D+\n");
else if(score[i]>=60) printf("D\n");
else if(score[i]>=0) printf("F\n");
}
}

  

体育成绩统计——20180801模拟赛T3的更多相关文章

  1. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  2. 体育成绩统计/ Score

    偏水向,请部分学术控谅解 题目过长,不再描述. 很显然就是一道大模拟对吧,我在这里贡献一下我打此题的思路与过程. 或许有些奇淫巧技可以供一些没有过掉的神犇借鉴一下. 2020.11.26 中午: 昨天 ...

  3. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

  4. LuoguP7426 [THUPC2017] 体育成绩统计 题解

    Update \(\texttt{2021.3.11}\) 修复了一个笔误. Content 太长了,请直接跳转回题面查看. 数据范围:\(n\leqslant 10^4\),\(0\leqslant ...

  5. ztz11的noip模拟赛T3:评分系统

    代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  6. 2019.10.18模拟赛T3

    题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为 ...

  7. 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)

    预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...

  8. 20180711模拟赛T3——聚变

    文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...

  9. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

随机推荐

  1. Java语言基础---逻辑运算(长路短路运算)

    长路短路运算的区别 长路与运算&:是指在两边都是整数时,是逐位与运算,在两边是关系运算时,是逻辑运算. 短路与运算&&:是指从左至右,遇到false,则停止后面的运算. 长路或 ...

  2. 【Linked List Cycle II】cpp

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  3. Github问题An error occurred trying to download

    Github for windows安装过程出现了这样的问题An error occurred trying to download 'http://github-windows.s3.amazona ...

  4. c语言入门-03-数据和c

    1>C语言提供两大系列的多种数据类型 1 /*platinum.c*/ 2 #include <stdio.h> 3 4 int main(void){ 5 float weight ...

  5. SQL 基础语法详解

    SQL 命令一般分为 DQL.DML.DDL DQL:数据查询语句,基本就是 SELECT 查询命令,用于数据查询 DML:Data Manipulation Language 的简称,即数据操纵语言 ...

  6. 14 Java虚拟机实现 synchronized

    java 中的 synchronized 运行 在 Java 中,我们经常用 synchronized 关键字对程序进行加锁.无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchroni ...

  7. 【转】Using Raycasts and Dynamically Generated Geometry to Create a Line of Sight on Unity3D

    http://www.linkedin.com/pulse/using-raycasts-dynamically-generated-geometry-create-line-thomas José ...

  8. 15个变态的Google面试题以及答案

    在当前经济形势不景气的情况下,谷歌招聘新员工是一件令人振奋的事,特别是对那些在当前金融风暴中渴望找到安全港的年轻经理们和软件开发商们来说是个好消息. 不过,也不要高兴太早,谷歌在招聘新员工时,更加青睐 ...

  9. 为MYSQL加注释--mysql注释符

    上午插入记录的时候一直没有成功,郁闷不知道为什么.因为是很多条记录一起插入,中间一些不用的数据就用"--"来注释了,结果没有效果. 没有办法,在网上找了找,才发现注释符" ...

  10. HTML 删除和添加字

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...