1. 程式人生 > >體育成績統計——20180801模擬賽T3

體育成績統計——20180801模擬賽T3

參加 沒有 top b- center 字典序 clu 次數 ast

體育成績統計 / 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