1 条题解

  • 0
    @ 2025-11-19 0:02:13

    题解

    本题就是按题面规则完成一堆固定的统计工作:

    1. 读入学生的基础信息,提前算出专项课成绩、体测(及格得 10 分)以及长跑测试的得分。长跑测试直接把题目给出的十个分数段硬编码成一个函数即可。
    2. “阳光长跑”部分先把每条记录按时间排序。我们把日期、时分秒转换成总秒数,依次检查是否满足五条合法性的限制:距离、平均速度、总暂停时间、平均步幅、与上一次合法运动之间间隔不少于 6 小时。若合法,就给对应学号的学生计数一次,并记录它的结束时间以便之后的间隔判断。
    3. 阳光长跑的次数可以对应到 7 个分数区间,表格同样直接用 if-else 写死即可。“大一专项计划”的出勤次数是班级训练营次数与阳光长跑合法次数之和,对照题面表格即可得到 0~5 分。
    4. 汇总所有分数,求出百分制成绩后再根据区间映射到等级。

    实现时完全不需要高深算法,把所有映射写成若干个函数即可。最终把学生按照学号排序输出学号、总分以及等级。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N=1e4+10,M=1.5e5+100;
    int n,m;
    struct student{
        string p;
        char g;
        int x;
        int m,s;
        char y;
        int f;
        int c;
        int score;
        int cnt;
        bool flag;
        bool operator<(student o) const{
            return p<o.p;
        }
    }a[N];
    struct record{
        int d;
        string p;
        int sth,stm,sts;
        int edh,edm,eds;
        double l;
        int spm,sps;
        int step;
        bool operator<(record o)const{
            if(d!=o.d) return d<o.d;
            if(sth!=o.sth) return sth<o.sth;
            if(stm!=o.stm) return stm<o.stm;
            return sts<o.sts;
        }
    }b[M];
    map<string,int> idx;
    map<string,int> lst;
    int id(string x){
        return idx[x];
    }
    int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int getday(string x){
        int mo=0,dy=0;
        for(int i=4;i<=5;i++) mo=mo*10+x[i]-'0';
        for(int i=6;i<=7;i++) dy=dy*10+x[i]-'0';
        int sum=dy;
        for(int i=1;i<mo;i++) sum+=mon[i];
        return sum;
    }
    int getpao(int m,int s,bool y){
        s=m*60+s;
        if(y==1){
            if(s<=750) return 20;
            if(s<=780) return 18;
            if(s<=810) return 16;
            if(s<=840) return 14;
            if(s<=870) return 12;
            if(s<=910) return 10;
            if(s<=950) return 8;
            if(s<=990) return 6;
            if(s<=1030) return 4;
            if(s<=1080) return 2;
            return 0;
        }else{
            if(s<=400) return 20;
            if(s<=417) return 18;
            if(s<=434) return 16;
            if(s<=451) return 14;
            if(s<=470) return 12;
            if(s<=485) return 10;
            if(s<=500) return 8;
            if(s<=515) return 6;
            if(s<=530) return 4;
            if(s<=540) return 2;
            return 0;
        }
    }
    int sunpao(double l,int t,int spa,int spb,int step,bool y){
        l*=1000;
        if(y==1&&l<3000) return 0;
        if(y==0&&l<1500) return 0;
        double s=l/t*1.0;
        if(t<=0) return 0;
        if(s<2||s>5) return 0;
        int spt=spa*60+spb;
        if(spt>4*60+30) return 0;
        double stlen=l*1.0/step;
        if(stlen>1.5) return 0;
        return 1;
    }
    int getsun(int cnt){
        if(cnt>=21) return 10;
        if(cnt>=19) return 9;
        if(cnt>=17) return 8;
        if(cnt>=14) return 7;
        if(cnt>=11) return 6;
        if(cnt>=7) return 4;
        if(cnt>=3) return 2;
        return 0;
    }
    int getcur(int cur){
        if(cur>=18) return 5;
        if(cur>=15) return 4;
        if(cur>=12) return 3;
        if(cur>=9) return 2;
        if(cur>=6) return 1;
        return 0;
    }
    string getscore(int s){
        if(s>=95) return "A";
        if(s>=90) return "A-";
        if(s>=85) return "B+";
        if(s>=80) return "B";
        if(s>=77) return "B-";
        if(s>=73) return "C+";
        if(s>=70) return "C";
        if(s>=67) return "C-";
        if(s>=63) return "D+";
        if(s>=60) return "D";
        return "F";
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i].p>>a[i].g;
            cin>>a[i].x;
            char tmp;
            cin>>a[i].m>>tmp>>a[i].s>>tmp;
            cin>>a[i].y>>a[i].f>>a[i].c;
            idx[a[i].p]=i;
            bool flag=(a[i].g=='M'?1:0);
            a[i].flag=flag;
            a[i].score=a[i].x+getpao(a[i].m,a[i].s,flag)+(a[i].y=='P'?10:0);
            a[i].cnt=0;
        }//还剩阳光长跑+大一专项计划
        cin>>m;
        for(int i=1;i<=m;i++){
            string d;
            cin>>d>>b[i].p;
            int day=getday(d);b[i].d=day;
            char tmp;
            cin>>b[i].sth>>tmp>>b[i].stm>>tmp>>b[i].sts;
            cin>>b[i].edh>>tmp>>b[i].edm>>tmp>>b[i].eds;
            cin>>b[i].l;
            cin>>b[i].spm>>tmp>>b[i].sps>>tmp;
            cin>>b[i].step;
        }
        sort(b+1,b+1+m);
        for(int i=1;i<=m;i++){
            int day=b[i].d;
            int stt=(day*24+b[i].sth)*3600+b[i].stm*60+b[i].sts;
            int edt=(day*24+b[i].edh)*3600+b[i].edm*60+b[i].eds;
            int t=edt-stt;
            int j=id(b[i].p);
            if((lst.find(b[i].p)==lst.end()||stt-lst[b[i].p]>=3600*6)&&sunpao(b[i].l,t,b[i].spm,b[i].sps,b[i].step,a[j].flag)){
                lst[b[i].p]=edt;
                a[j].cnt++;
            }
        }
        for(int i=1;i<=n;i++){
            a[i].score+=getsun(a[i].cnt);
            int cur=a[i].c+a[i].cnt;
            a[i].score+=getcur(cur)+a[i].f;
        }
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++) cout<<a[i].p<<" "<<a[i].score<<" "<<getscore(a[i].score)<<"\n";
        return 0;
    }
    
    • 1

    信息

    ID
    5468
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者