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