P7426求调re
  • 板块学术版
  • 楼主xiepingfang
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/22 15:20
  • 上次更新2023/11/2 18:45:37
查看原帖
P7426求调re
745667
xiepingfang楼主2023/9/22 15:20

写了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;
    }
}
2023/9/22 15:20
加载中...