zoukankan      html  css  js  c++  java
  • 体育成绩统计——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 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
    ");
    	}
    }
    

      

  • 相关阅读:
    【算法工程师/专家(用户行为分析方向),阿里云计算有限公司】前程无忧官方招聘网站
    linux文件设备与I/O: dup和dup2函数
    【高级网页分析工程师,360安全卫士】前程无忧官方招聘网站
    分享:gzip头部格式
    C调试时常用的宏
    分享:Waterfox 18.0.1 发布,64 位的 Firefox
    开发人员应该对IIS理论层的知识了解的多一些~第三讲 网页从IIS端到客户端浏览器经历的阶段
    开发人员应该对IIS理论层的知识了解的多一些~第一讲 什么是Http?
    开发人员应该对IIS理论层的知识了解的多一些~第二讲 静态网页与动态网页如何被解释执行的
    Javascript基础与面向对象基础~目录
  • 原文地址:https://www.cnblogs.com/yangsongyi/p/9403992.html
Copyright © 2011-2022 走看看