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);
}

等号位置,还有数组开大点

敲模拟时一定要分清自己的变量意义等等

posted @ 2021-07-17 07:01  floatbamboo  阅读(98)  评论(0)    收藏  举报