写这道题最重要的是条理清晰。
除了阳光长跑外,其他的都能在读入的时候处理掉。
处理阳光长跑最头疼的就是处理时间。
把时间单位都变成秒就好啦。
我们算出从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;
}