P7426 [THUPC2017] 体育成绩统计 题解
关于大模拟
模拟啊,就是按照题意敲代码,题意应该都懂
然后再注意细节然后再肝1天就能快乐的切掉一道模拟题
我在这里说一下如何方便的切掉这道题:
将时间转化为秒,你想想一年才31536000秒,没超int范围,可以直接用秒进行加减,比较好算
至于阳光长跑的学号怎么对应人,当然是用map了STL大法好
#define P pair<string,int>
map<string,int> t;//定义一个t数组来存映射
t.insert(P(x[i].num,i));//插入时直接插入pair类型
int k=t[y[i].nu];//用时直接当数组用,pair的first作为下标
scanf("%d",&xx);//读入分
getchar();//读入'
scanf("%d",&yy);//读入秒
getchar();//读入"
x[i].sec=xx*60+yy;转化成秒
预处理男生和女生多少秒的得分
int xzm[12]={0,1080,1030,990,950,910,870,840,810,780,750,0};//男生
int xzf[12]={0,540,530,515,500,485,470,451,434,417,400,0};女生
for(int i=1;i<=n;i++)
{
x[i].ans+=x[i].ty;
if(x[i].xb=='M')
{
for(int j=1;j<=10;j++)
{
if(x[i].sec<=xzm[j]&&x[i].sec>xzm[j+1])//注意等号的位置
{
x[i].ans+=j*2;
break;
}
}
}
else
{
for(int j=1;j<=10;j++)
{
if(x[i].sec<=xzf[j]&&x[i].sec>xzf[j+1])//注意等号的位置
{
x[i].ans+=j*2;
break;
}
}
}
}
可以将阳光长跑的日期也换成秒,视作该时间距2017年1月0日的秒数
int sm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<=12;i++)
{
sm[i]+=sm[i-1];
}
//预处理每个月距1月0日的天数
scanf("%d:%d:%d",&y[i].shh,&y[i].smm,&y[i].sss);
scanf("%d:%d:%d",&y[i].ehh,&y[i].emm,&y[i].ess);
y[i].sj=(y[i].ehh-y[i].shh)*3600+(y[i].emm-y[i].smm)*60+y[i].ess-y[i].sss;//阳光长跑跑步的时间
y[i].tt=(sm[y[i].mon-1]+y[i].da-1)*86400;//到1月0日的秒数
然后附上我丑陋的代码:
#include<bits/stdc++.h>
using namespace std;
#define P pair<string,int>
const int N=50000,M=200000;
map<string,int> t;
struct student{
int ty,gra,times,ans,sec,tt;
char xb,tg;
string num;
}x[N];
struct run{
int mon,da,shh,smm,sss,ehh,emm,ess,a,tt,bs;
double l,sj;
string nu;
}y[M];
int n,m,v[N],xx,yy,las[N];
int sm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int xzm[12]={0,1080,1030,990,950,910,870,840,810,780,750,0};
int xzf[12]={0,540,530,515,500,485,470,451,434,417,400,0};
string s;
bool cmp(student x,student y)
{
return x.num<y.num;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=12;i++)
{
sm[i]+=sm[i-1];
}
for(int i=1;i<=n;i++)
{
cin>>x[i].num;
t.insert(P(x[i].num,i));
cin>>x[i].xb;
scanf("%d",&x[i].ty);
scanf("%d",&xx);
getchar();
scanf("%d",&yy);
getchar();
x[i].sec=xx*60+yy;
cin>>x[i].tg;
if(x[i].tg=='P')
x[i].ans+=10;
scanf("%d",&x[i].gra);
x[i].ans+=x[i].gra;
scanf("%d",&x[i].times);
}
y[0].tt=-0x3f3f3f3f;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>s;
y[i].mon=(s[4]-'0')*10+s[5]-'0';
y[i].da=(s[6]-'0')*10+s[7]-'0';
cin>>y[i].nu;
scanf("%d:%d:%d",&y[i].shh,&y[i].smm,&y[i].sss);
scanf("%d:%d:%d",&y[i].ehh,&y[i].emm,&y[i].ess);
y[i].sj=(y[i].ehh-y[i].shh)*3600+(y[i].emm-y[i].smm)*60+y[i].ess-y[i].sss;
scanf("%lf",&y[i].l);
y[i].l*=1000;
scanf("%d",&xx);
getchar();
scanf("%d",&yy);
getchar();
y[i].a=xx*60+yy;
scanf("%d",&y[i].bs);
y[i].tt=(sm[y[i].mon-1]+y[i].da-1)*86400;
}
for(int i=1;i<=n;i++)
{
x[i].ans+=x[i].ty;
if(x[i].xb=='M')
{
for(int j=1;j<=10;j++)
{
if(x[i].sec<=xzm[j]&&x[i].sec>xzm[j+1])
{
x[i].ans+=j*2;
break;
}
}
}
else
{
for(int j=1;j<=10;j++)
{
if(x[i].sec<=xzf[j]&&x[i].sec>xzf[j+1])
{
x[i].ans+=j*2;
break;
}
}
}
}
for(int i=1;i<=m;i++)
{
int k=t[y[i].nu];
if(y[i].tt+(y[i].shh*3600+y[i].smm*60+y[i].sss)-(y[las[k]].tt+y[las[k]].ehh*3600+y[las[k]].emm*60+y[las[k]].ess)<21600)
continue;
double vv,bf;
vv=y[i].l/(y[i].sj*1.00);
bf=y[i].l/(y[i].bs*1.00);
if(x[k].xb=='M')
{
if(y[i].l>=3000&&vv>=2&&vv<=5&&y[i].a<=270&&bf<=1.5)
{
v[k]++;
las[k]=i;//注意要对每个人开一个last数组有一个小时就肝在这
}
}
else
{
if(y[i].l>=1500&&vv>=2&&vv<=5&&y[i].a<=270&&bf<=1.5)
{
v[k]++;
las[k]=i;
}
}
}
for(int i=1;i<=n;i++)
{
if(v[i]>=3&&v[i]<=6)
x[i].ans+=2;
if(v[i]>=7&&v[i]<=10)
x[i].ans+=4;
if(v[i]>=11&&v[i]<=13)
x[i].ans+=6;
if(v[i]>=14&&v[i]<=16)
x[i].ans+=7;
if(v[i]>=17&&v[i]<=18)
x[i].ans+=8;
if(v[i]>=19&&v[i]<=20)
x[i].ans+=9;
if(v[i]>=21)
x[i].ans+=10;
v[i]=v[i]+x[i].times;
if(v[i]>=6&&v[i]<=8)
x[i].ans+=1;
if(v[i]>=9&&v[i]<=11)
x[i].ans+=2;
if(v[i]>=12&&v[i]<=14)
x[i].ans+=3;
if(v[i]>=15&&v[i]<=17)
x[i].ans+=4;
if(v[i]>=18)
x[i].ans+=5;
}
sort(x+1,x+1+n,cmp);
for(int i=1;i<=n;i++)
{
cout<<x[i].num<<" ";
printf("%d ",x[i].ans);
int an=x[i].ans;
string dj;
if(an>=0&&an<60)
dj="F";
if(an>=60&&an<63)
dj="D";
if(an>=63&&an<67)
dj="D+";
if(an>=67&&an<70)
dj="C-";
if(an>=70&&an<73)
dj="C";
if(an>=73&&an<77)
dj="C+";
if(an>=77&&an<80)
dj="B-";
if(an>=80&&an<85)
dj="B";
if(an>=85&&an<90)
dj="B+";
if(an>=90&&an<95)
dj="A-";
if(an>=95&&an<=100)
dj="A";
cout<<dj<<endl;
}
return 0;
fclose(stdin);
fclose(stdout);
}
等号位置,还有数组开大点
敲模拟时一定要分清自己的变量意义等等

浙公网安备 33010602011771号