体育成绩统计——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",&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");
	}
}

  

原文地址:https://www.cnblogs.com/yangsongyi/p/9403992.html

时间: 2024-08-29 12:17:12

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

20180520模拟赛T3——chess

[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\)的时候,马在原点.每个时刻马都跳一步. 可是这个坐标图有点残缺,有几个点是不能跳到的. 然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子. [输入格式] 从文件chess.in中读入数据. 第一行两个数K,n表示时间上限和残缺的点的数量. 接下来n行,每行一个坐标 xi,yi

[10.5模拟赛]T3

T3 Description 小\(Z\)是\(ZRP(Zombies' Republic of Poetry\),僵尸诗歌共和国\()\)的一名诗歌爱好者,最近他研究起了诗词音律的问题. 在过去,诗词是需要编成曲子唱出来的,比如下面这首<菩萨蛮>,唱出来的话其对应的音符就是这样的: 南园满地堆轻絮, 愁闻一霎清明雨 1 1 5 5 6 6 5 4 4 3 3 2 2 1 因而可以发现,"1 1 5 5 6 6 5 4 4 3 3 2 2 1" 这串音符就成为了研究音律的

2019.10.18模拟赛T3

题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为了更好统计,把原式变为$n^2-\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)\leq n]$. 然后开始毒瘤... 首先,考虑枚举$lcm(i,j)$,设为$d$,计算有多少对$i.j$的最小公倍数为$d$. 设$i=p_1^{a_1}p_2^{a_2}\

[10.31模拟赛]T3

Description 青青草原上有\(k\)只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献从小到大排成一排,以便于发放奖金. 每只羊都会得到数值在\(1\)~\(n\)的奖金,并且第i只羊的奖金应为第\(i+1\)只羊的约数(即满足\(ai|ai+1\)). 现在包包大人想知道一共有多少种不同的发放奖金的方式(两种发放奖金的方式不同是指在两种发放奖金的方式中存在某只羊拿到的奖金不同) Input 一行两个正整数\(n\),\(k\),满足

字符串模拟赛T3

只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<stack> using namespace std; const int maxn = 1005; int n,m,ans;

[模拟赛] T3 最优序列

Description 给出一个长度为n(n<=1000)的正整数序列,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过k(k<=m<=10)个,并且选出的元素之和最大. Input 第一行三个数n,m,k. 第二行n个数,表示各元素数值大小. Output 一个数,表示最大元素和. Range 对于10%的数据,n<=10 对于30%的数据,n<=100 对于100%的数据,n<=1000, m从1到10随机(10的情况比较多) Solution 看范

[模拟赛] T3 Exploit

Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发) eXterminate(征服) --维基百科 今次我们着重考虑exploit部分,并将其模型简化: 你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球. 星球笼统的分为2类:资源型和维修型.(p为钻头当前能力值) 1.资源型:含矿物质量a[i],若选择开采

20180524模拟赛T3——Word

[题目描述] 有一个星球要创造新的单词,单词有一些条件: 字母集有\(p\)个元音和\(q\)个辅音,单词由字母构成 每个单词最多有\(n\)个元音和\(n\)个辅音(同一元音或辅音可重复使用) 每个单词中元音总是出现在所有辅音之前,可以没有元音或没有辅音 每个单词至少有一个字母 可以在字母上标记重音.元音中最多标记一个,辅音中也最多标记一个,一个单词中最多标记两个字母为重音 如果两个单词字母.字母顺序或者重音不同就认为这两个单词不同. 他们想要知道一共能创造多少不同的单词,由于答案可能很大,所

20180610模拟赛T3——书本整理

[问题描述] 小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱.小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和. 例如有4本书: 1×2 5×3 2×4 3×1 那么小明将其排列整齐后的顺序是: 1×2 2×4 3×1 5×3 凌乱值就是2+3+2=7. 于是小明决定拿掉其中的k本书,使凌乱值最小,你能帮他求出这个最小值吗?已知每本书的高度都不一样. [问题输入] 第一