体育成绩统计——20180801模拟赛T3
体育成绩统计 / 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",×[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的更多相关文章
- 20180520模拟赛T3——chess
[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...
- 体育成绩统计/ Score
偏水向,请部分学术控谅解 题目过长,不再描述. 很显然就是一道大模拟对吧,我在这里贡献一下我打此题的思路与过程. 或许有些奇淫巧技可以供一些没有过掉的神犇借鉴一下. 2020.11.26 中午: 昨天 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- LuoguP7426 [THUPC2017] 体育成绩统计 题解
Update \(\texttt{2021.3.11}\) 修复了一个笔误. Content 太长了,请直接跳转回题面查看. 数据范围:\(n\leqslant 10^4\),\(0\leqslant ...
- ztz11的noip模拟赛T3:评分系统
代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 2019.10.18模拟赛T3
题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为 ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)
预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...
- 20180711模拟赛T3——聚变
文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
随机推荐
- 【小程序入门集锦】19,微信小程序个人帐号申请
个人账号与企业帐号相比,缺少支付等功能,与个人订阅号类似. 小程序开放个人开发者申请注册,个人用户可访问微信公众平台,扫码验证个人身份后即可完成小程序帐号申请并进行代码开发. 下面我们就来说说 ...
- UVa 1649 Binomial coefficients 数学
题意: \(C(n, k) = m(2 \leq m \leq 10^{15})\),给出\(m\)求所有可能的\(n\)和\(k\). 分析: 设\(minK = min(k, n - k)\),容 ...
- Python框架之Django学习笔记(一)
Django历史: Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的. 它诞生于 2003 年秋天,那时 Lawrenc ...
- leetcode 【 Sort List 】 python 实现
题目: Sort a linked list in O(n log n) time using constant space complexity. 代码:oj 测试通过 Runtime: 372 m ...
- BMP图片的加载方式:资源 VS 文件
在程序中加载位图有很多方法,各有各的好处.这里简单说一下在资源里和文件里加载的区别. 第一.在资源里加载位图 这种方法就是在工程里的“资源视图”-->“添加资源”-->"Bitm ...
- lucene.NET详细使用与优化详解
lucene.NET详细使用与优化详解 http://www.cnblogs.com/qq4004229/archive/2010/05/21/1741025.html http://www.shan ...
- Python基础-week07 Socket网络编程
一 客户端/服务器架构 1.定义 又称为C/S架构,S 指的是Server(服务端软件),C指的是Client(客户端软件) 本章的中点就是教大写写一个c/s架构的软件,实现服务端软件和客户端软件基于 ...
- day02_01.能被3整除的数
第1题 能被3整除的数 编程思想的初步形成 把人的正常思维放大化,用放大镜去放大你的每个思考过程 你会发现,原来编程没有你想象的那么难 题目:输出100以内(不含100)能被3整除的所有整数 < ...
- C#中的is和as的转型区别
摘自CLR via C#第三版第四章 在c#中is可以用来判断一个对象是否兼容给定的类型,如果是返回true,否则返回false. 同时is是永不会抛出异常的.如果对象引用是null,is操作符总是返 ...
- BZOJ 1877:[SDOI2009]晨跑(最小费用最大流)
晨跑DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...