体育成绩统计——20180801模拟赛t3

yangsongyi yangsongyi     2022-12-20     473

关键词:

体育成绩统计 / 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 imes10^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
");
		else if(score[i]>=90) printf("A-
");
		else if(score[i]>=85) printf("B+
");
		else if(score[i]>=80) printf("B
");
		else if(score[i]>=77) printf("B-
");
		else if(score[i]>=73) printf("C+
");
		else if(score[i]>=70) printf("C
");
		else if(score[i]>=67) printf("C-
");
		else if(score[i]>=63) printf("D+
");
		else if(score[i]>=60) printf("D
");
		else if(score[i]>=0) printf("F
");
	

  

57级返校测试-t3-成绩单(代码片段)

...,是用字符串表示的(不超过30位),每次考试结束后,成绩统计是一件很重要的事情。老师们都很关心学生的成绩,于是他们把学生的成绩按学号排列(字典顺序,学号全为小写字母,从小到大排列)(不排成绩),并统计各个... 查看详情

清北学堂模拟赛d6t3反击数

分析:显然是一道数位dp题,不过需要一些奇怪的姿势.常规的数位dp能统计出一个区间内满足条件的数的个数,可是我们要求第k个,怎么办呢?转化为经典的二分问题,我们二分当前数的大小,看它是第几大的,就可以了. &n... 查看详情

体育统计数据的 SQL 表设计

】体育统计数据的SQL表设计【英文标题】:SQLtabledesignforsportsstats【发布时间】:2014-05-0110:24:56【问题描述】:我正在尝试创建一个数据库架构,我可以在其中存储体育联盟的统计数据,其中每场比赛都有球队统计数据。我有以... 查看详情

t3成绩单题解

这个题本来不归我讲,但我A完之后觉得太坑了,还是讲一下吧。首先这个题有个重要的地方:(字典顺序,学号全为小写字母,从小到大排列)字典序和字典顺序是不一样的!!!我以为是字典序……,wa了,字典顺序就是... 查看详情

c语言(学生成绩管理系统)

...英语,高等数学,大学物理,C语言,机械制图,政治,体育。要求实现成绩读入,增加,删除;可以按姓名,学号,成绩查询;可以找到每门课的最高分,最低分;可以得到某门课的优良中差统计;成绩排序,分支判断统计;... 查看详情

预测球队比赛成绩

本文尝试采用自顶向下的设计方法进行体育竞技分析。自顶向下即将一个复杂问题分解成几个问题,再细分成一个个具体的小问题,从而来解决复杂问题。一、采用乒乓球比赛规则(学号尾号为3必做题)比赛规则:(1)一局比... 查看详情

t13330857级返校测试重测-t3-成绩单(代码片段)

大致题意:给定n个学生的学号和分数,求各个分数段的人数,求把学号排序后的序列,求满分的人数以及学号。基本思路:虽然看起来很繁琐(?),但就非常非常的简单,直接按题意做就好了。然后有个坑,这是(color#FF3030字典顺序)... 查看详情

如何在 Rails 上运行模拟? (例如体育/股票市场/等)

】如何在Rails上运行模拟?(例如体育/股票市场/等)【英文标题】:HowdoIrunsimulationsonrails?(e.g.sports/stockmarket/etc)【发布时间】:2011-06-1208:03:02【问题描述】:我有兴趣创建一些基于数据模拟结果的网络应用。例如,棒球或股票市... 查看详情

2017922

...的图论题,明天上下午模拟,晚上就切图论吧。。。 模拟赛T2题解:http://www.cn 查看详情

学生成绩统计

package成绩;publicclassGrade   privatedoublechinese;  //语文成绩   privatedoublemath;   //数学成绩   privatedoubleenglish; //英语成绩  查看详情

体育竞技(代码片段)

一、排球训练营1.简介:模拟不同的两个队伍进行排球的模拟比赛。2.模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行(P),最后输出模拟的结果(O)。P简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示... 查看详情

成绩统计

package统计成绩;importjava.util.Scanner;//输入输出函数定义publicclassSum  publicstaticvoidmain(String[]args)          Scannerscan=newScanner(System.in 查看详情

2017noip模拟赛三a酱的体育课

 据说改编自$CodeM美团点评编程大赛初赛A轮$简单的水题。。。考试的时候没想到,xjb打了暴力。显然,第$x$个人排在第$y$个位置的情况总数为$(n-1)!$,在这些情况中,第$x$人对答案的贡献是相同的,记为$p_{x,y}$。总的情况数... 查看详情

20171010

当前最好成绩:noip2016初赛32.5模拟赛(3):140模拟赛(6):270评级:零 九月的最后几天,肝了两道图论之后开始研究一些稀奇古怪的问题,然后就去辅导了。听课之后才发现,这明明就是一个省选的班,一共只有我校与另... 查看详情

体育竞技模拟比赛

乒乓球比赛基本规则: 一方首先具有发球权,双方连续击打,球落地则该回合结束。如果输掉这一回合的是发球方,双方均不加分,但发球权要交给另一方。如果发球方赢得了这一回合,则发球方赢得1分,并继续拥有发球... 查看详情

20180524模拟赛t3——word

【题目描述】有一个星球要创造新的单词,单词有一些条件:字母集有\(p\)个元音和\(q\)个辅音,单词由字母构成每个单词最多有\(n\)个元音和\(n\)个辅音(同一元音或辅音可重复使用)每个单词中元音总是出现在所有辅音之前,... 查看详情

乒乓球比赛规则模拟体育分析(代码片段)

fromrandomimportrandomdefprintIntro():#打印程序介绍信息print("12号朱益民进行比赛分析结果:")print("这个程序模拟两个队伍A和B的某种竞技比赛")print("程序运行需要队伍A和队伍B的能力值(以0到1之间的小数表示)")defgetInputs():#获得程序运... 查看详情

ztz11的noip模拟赛t3:评分系统(代码片段)

代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineriiregisterinti#definerijregisterintj#defineintlonglongusingnamespacestd;intn1,m1,p,nl[100005],t 查看详情