P7426 [THUPC2017] 体育成绩统计 模拟

题目链接

写这道题最重要的是条理清晰。

除了阳光长跑外,其他的都能在读入的时候处理掉。

处理阳光长跑最头疼的就是处理时间。

把时间单位都变成秒就好啦。

我们算出从2017年1月1日0点到这时刻有多少秒就行啦。

代码注释很详细,具体看代码吧。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<map>
#define LD long double
using namespace std;
int n,m;
const int N=4010;
map<int,int>mp;
int read()
{
    int res=0;char ch=getchar();bool XX=false;
    for(;!isdigit(ch);ch=getchar())(ch=='-') && (XX=true);
    for(;isdigit(ch);ch=getchar())res=(res<<3)+(res<<1)+(ch^48);
    return XX?-res:res;
}
/*---------以下是得分--------------*/
void dengji(int x)//等级 
{
	if(95<=x&&x<=100)printf("A");
	if(90<=x&&x<=94)printf("A-");
	if(85<=x&&x<=89)printf("B+");
	if(80<=x&&x<=84)printf("B");
	if(77<=x&&x<=79)printf("B-");
	if(73<=x&&x<=76)printf("C+");
	if(70<=x&&x<=72)printf("C");
	if(67<=x&&x<=69)printf("C-");
	if(63<=x&&x<=66)printf("D+");
	if(60<=x&&x<=62)printf("D");
	if(0<=x&&x<=59)printf("F");
}
int yangguang(int x)//阳光得分 
{
	if(21<=x)return 10;
	if(19<=x&&x<=20)return 9;
	if(17<=x&&x<=18)return 8;
	if(14<=x&&x<=16)return 7;
	if(11<=x&&x<=13)return 6;
	if(7<=x&&x<=10)return 4;
	if(3<=x&&x<=6)return 2;
	return 0;
}
int chuqin(int x)//出勤 
{
	if(18<=x)return 5;
	if(15<=x&&x<=17)return 4;
	if(12<=x&&x<=14)return 3;
	if(9<=x&&x<=11)return 2;
	if(6<=x&&x<=8)return 1;
	return 0;
}
int ti(int a,int b){return a*60+b;}//分钟转化为秒 
int changpao(char x,int t)//长跑  
{
	int res=0;
	if(x=='M')
	{
		if(t<=ti(18,0) )res=2;
		if(t<=ti(17,10))res=4;
		if(t<=ti(16,30))res=6;
		if(t<=ti(15,50))res=8;
		if(t<=ti(15,10))res=10;
		if(t<=ti(14,30))res=12;
		if(t<=ti(14,0) )res=14;
		if(t<=ti(13,30))res=16;
		if(t<=ti(13,0) )res=18;
		if(t<=ti(12,30))res=20;
	}
	else 
	{
		if(t<=ti(9,0) )res=2;
		if(t<=ti(8,50))res=4;
		if(t<=ti(8,35))res=6;
		if(t<=ti(8,20))res=8;
		if(t<=ti(8,5) )res=10;
		if(t<=ti(7,50))res=12;
		if(t<=ti(7,31))res=14;
		if(t<=ti(7,14))res=16;
		if(t<=ti(6,57))res=18;
		if(t<=ti(6,40))res=20;
	}
	return res;
}
/*------------以上是得分---------*/
struct xuesheng//学生 
{
	int id,ans,cnt,tot,las;//ans:总得分 cnt和tot:出勤 las:最后一次合法记录时间 
	char xb;//性别 
	friend bool operator <(const xuesheng &x,const xuesheng &y)
	{
		return x.id<y.id;
	}
}a[N];
void duru()
{
	int lin,x,y;char xxx[10];
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		a[i].id=read();
		
		scanf("%s",xxx);
		a[i].xb=xxx[0];

		lin=read();a[i].ans+=lin;//体育课专项成绩

		x=read();y=read();a[i].ans+=changpao(a[i].xb,ti(x,y));//长跑测试成绩
		
		scanf("%s",xxx);if(xxx[0]=='P')a[i].ans+=10;//体质测试成绩
		
		lin=read();a[i].ans+=lin;//期末检测成绩
		a[i].cnt=read();//参加班级训练营的次数
		a[i].las=-9999999;
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;++i)mp[a[i].id]=i;
}
int yyy[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};//记录每个月有多少天 
int sj(int yue/*月*/,int ri/*日*/)//返回从1月1日0点到这一天有多少秒 
{
	int res=0;
	for(int i=1;i<yue;++i)res+=yyy[i];
	res+=ri;
	return res*24*60*60;//秒 
}
int Ti(int a,int b,int c)//小时转化为秒 
{
	return a*3600+b*60+c;//秒 
}
void yang_guang_chang_pao()//处理阳光长跑数据 
{
	int rq,hao,t1,t2,t3,t4,t5,t6,t7,t8,stp,T1,T2,T;
	long double jl;
	cin>>m;
	while(m--)
	{
		rq=read();rq%=10000;T=sj(rq/100,rq%100);//rq:日期 
		hao=read();  hao=mp[hao];//学号 
		t1=read();t2=read();t3=read();//开始时间 
		t4=read();t5=read();t6=read();//结束时间 
		cin>>jl;jl*=1000;//距离 
		t7=read();t8=read();//暂停时间 
		stp=read();
		T1=Ti(t1,t2,t3);T2=Ti(t4,t5,t6);//转化为秒	
		if((a[hao].xb=='M'&&jl<3000) || (a[hao].xb=='F'&&jl<1500))continue;//不符合要求1
		if(jl/((LD)T2-T1) < 2 || jl/((LD)T2-T1) > 5)continue;//不符合要求2
		if(ti(t7,t8)>ti(4,30))continue;//不符合要求3
		if(jl/(LD)stp>1.5)continue;//不符合要求4
		
		
		if(T + T1 - a[hao].las < Ti(6,0,0))continue;
		++a[hao].tot;a[hao].las=T+T2;//记得更新最后一条合法记录的结束时间 
	}
}
void shuchu()
{
	for(int i=1;i<=n;++i)
	{
		a[i].ans+=yangguang(a[i].tot); 
		a[i].ans+=chuqin(a[i].cnt+a[i].tot);//出勤分数 
		printf("%d %d ",a[i].id,a[i].ans);dengji(a[i].ans);
		puts("");
	}
}
int main()
{
	duru();//读入 
	yang_guang_chang_pao();//处理阳光长跑的数据 
	shuchu();//输出 
	fclose(stdin);fclose(stdout);
	return 0;
}
posted @ 2021-07-16 08:43  wljss  阅读(84)  评论(0编辑  收藏  举报