写了3小时,调了两小时,要崩溃了qwq
#include <bits/stdc++.h>
using namespace std;
map <int, int> q;
int month[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct node{
long long id;//id表示学号
bool xb;//xb表示性别,0为男,1为女
int time, cnt, sum, yg;
/*time表示期末长跑成绩的时间
cnt表示参加班级训练营的次数
sum表示总分
yg表示阳光长跑的合法次数*/
string levle;//levle表示等级
}e[10001];
struct edon{
int sday, yday, sh, sm, ss, fh, fm, fs, m, s, step, yh=-1, ym, ys;
/*sday表示记录的完成日期
sh, sm, ss, fh, fm, fs分别表示记录的开始时间和结束时间
yday, yh, ym, ys表示上次记录的结束时间
m,s表示记录的总暂停时间的分秒
step表示记录的运动总步数
*/
long long id;//id表示学号
double km;//表示记录的运动距离
}f[10001];
void cp(int i){//统计长跑得分
if (e[i].xb){//女生
if(e[i].time<=400){
e[i].sum+=20;
}else if(e[i].time<=417){
e[i].sum+=18;
}else if(e[i].time<=434){
e[i].sum+=16;
}else if(e[i].time<=451){
e[i].sum+=14;
}else if(e[i].time<=470){
e[i].sum+=12;
}else if(e[i].time<=485){
e[i].sum+=10;
}else if(e[i].time<=500){
e[i].sum+=8;
}else if(e[i].time<515){
e[i].sum+=6;
}else if(e[i].time<530){
e[i].sum+=4;
}else if(e[i].time<540){
e[i].sum+=2;
}
}else{//男生
if(e[i].time<=750){
e[i].sum+=20;
}else if(e[i].time<=780){
e[i].sum+=18;
}else if(e[i].time<=810){
e[i].sum+=16;
}else if(e[i].time<=840){
e[i].sum+=14;
}else if(e[i].time<=870){
e[i].sum+=12;
}else if(e[i].time<=910){
e[i].sum+=10;
}else if(e[i].time<=950){
e[i].sum+=8;
}else if(e[i].time<990){
e[i].sum+=6;
}else if(e[i].time<1030){
e[i].sum+=4;
}else if(e[i].time<1080){
e[i].sum+=2;
}
}
}
void yg(int i){//统计本次阳光长跑是否合法
if (e[q[f[i].id]].xb){//判断性别
if (f[i].km<1.5){
return;
}
}else{
if (f[i].km<3){
return;
}
}
int ttt=f[i].sh*3600+f[i].sm*60+f[i].ss-f[i].fh*3600-f[i].fm*60-f[i].fs;//跑步总时长
if (f[i].km*1000/ttt<2||f[i].km*1000/ttt>5){//判断平均速度
return;
}
if (f[i].m>3&&f[i].s>30){//判断总暂停时间
return;
}
if (f[i].km/f[i].step>1.5){//判断平均步幅
return;
}
if ((f[i].ym!=-1&&f[i].yh*3600+f[i].ym*60+f[i].ys-f[i].sh*3600-f[i].sm*60-f[i].ss<21600)&&f[i].sday/100==f[i].yday&&f[i].sday%100==month[f[i].sday/100]&&f[i].yday%100==month[f[i].yday/100]){//判断开始时间是否与上条合法记录的结束时间间隔6小时以上
return;
}
//更新上次记录
f[i].yh=f[i].sh;
f[i].ym=f[i].sm;
f[i].ys=f[i].ss;
f[i].yday=f[i].sday;
e[q[f[i].id]].yg++;
}
void yg_totle(int i){//统计阳光长跑合法次数
if (e[i].yg>=21){
e[i].sum+=10;
}else if(e[i].yg>=19){
e[i].sum+=9;
}else if(e[i].yg>=17){
e[i].sum+=8;
}else if(e[i].yg>=14){
e[i].sum+=7;
}else if(e[i].yg>=11){
e[i].sum+=6;
}else if(e[i].yg>=7){
e[i].sum+=4;
}else if(e[i].yg>=3){
e[i].sum+=2;
}
}
void cq(int i){//计算大一专项计划的出勤得分
int sum=e[i].cnt+e[i].yg;
if (sum>=18){
e[i].sum+=5;
}else if(sum>=15){
e[i].sum+=4;
}else if(sum>=12){
e[i].sum+=3;
}else if(sum>=9){
e[i].sum+=2;
}else if(sum>=6){
e[i].sum+=1;
}
}
void levle(int i){//计算等级
if (e[i].sum>=95){
e[i].levle="A";
}else if(e[i].sum>=90){
e[i].levle="A-";
}else if(e[i].sum>=85){
e[i].levle="B+";
}else if(e[i].sum>=80){
e[i].levle="B";
}else if(e[i].sum>=77){
e[i].levle="B-";
}else if(e[i].sum>=73){
e[i].levle="C+";
}else if(e[i].sum>=70){
e[i].levle="C";
}else if(e[i].sum>=67){
e[i].levle="C-";
}else if(e[i].sum>=63){
e[i].levle="D+";
}else if(e[i].sum>=60){
e[i].levle="D";
}else{
e[i].levle="F";
}
}
int main(){
int n, m;
cin >> n;
for (int i=1; i<=n; i++){
char a, b, c;//a用于吞掉字符,b,c用来储存临时数据
int x, sum1, sum2;//x用于读取分钟,sum1和sum2用于储存体育课专项成绩和大一专项计划的期末检测成绩
cin >> e[i].id >> b >> sum1 >> x >> a >> e[i].time >> a >> c >> sum2 >> e[i].cnt;
if (b=='M'){//判断性别
e[i].xb=0;
}else{
e[i].xb=1;
}
if (c=='P'){//判断体质测试是否通过
e[i].sum+=10;
}
e[i].sum+=sum1+sum2;//加上体育课专项成绩和大一专项计划的期末检测成绩
e[i].time+=x*60;//计算时间
cp(i);//统计长跑得分
q[e[i].id]=i;//把学号和索引对应
}
cin >> m;
for (int i=1; i<=m; i++){
char a;//a用于吞掉字符
cin >> f[i].sday >> f[i].id >> f[i].sh >> a >> f[i].sm >> a >> f[i].ss >> f[i].fh >> a >> f[i].fm >> a >> f[i].fs >> f[i].km >> f[i].m >> a >> f[i].s >> a >> f[i].step;
f[i].sday%=10000;
yg(i);//统计本次阳光长跑是否合法
}
for (int i=1; i<=n; i++){
yg_totle(i);//统计阳光长跑合法次数
cq(i);//计算大一专项计划的出勤得分
levle(i);//计算等级
cout << e[i].id << " " << e[i].sum << " " << e[i].levle << endl;
}
}