zoukankan      html  css  js  c++  java
  • P7426 [THUPC2017] 体育成绩统计 模拟

    题目链接

    写这道题最重要的是条理清晰。

    除了阳光长跑外,其他的都能在读入的时候处理掉。

    处理阳光长跑最头疼的就是处理时间。

    把时间单位都变成秒就好啦。

    我们算出从2017年1月1日0点到这时刻有多少秒就行啦。

    代码注释很详细,具体看代码吧。

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<map>
    #define LD long double
    using namespace std;
    int n,m;
    const int N=4010;
    map<int,int>mp;
    int read()
    {
        int res=0;char ch=getchar();bool XX=false;
        for(;!isdigit(ch);ch=getchar())(ch=='-') && (XX=true);
        for(;isdigit(ch);ch=getchar())res=(res<<3)+(res<<1)+(ch^48);
        return XX?-res:res;
    }
    /*---------以下是得分--------------*/
    void dengji(int x)//等级 
    {
    	if(95<=x&&x<=100)printf("A");
    	if(90<=x&&x<=94)printf("A-");
    	if(85<=x&&x<=89)printf("B+");
    	if(80<=x&&x<=84)printf("B");
    	if(77<=x&&x<=79)printf("B-");
    	if(73<=x&&x<=76)printf("C+");
    	if(70<=x&&x<=72)printf("C");
    	if(67<=x&&x<=69)printf("C-");
    	if(63<=x&&x<=66)printf("D+");
    	if(60<=x&&x<=62)printf("D");
    	if(0<=x&&x<=59)printf("F");
    }
    int yangguang(int x)//阳光得分 
    {
    	if(21<=x)return 10;
    	if(19<=x&&x<=20)return 9;
    	if(17<=x&&x<=18)return 8;
    	if(14<=x&&x<=16)return 7;
    	if(11<=x&&x<=13)return 6;
    	if(7<=x&&x<=10)return 4;
    	if(3<=x&&x<=6)return 2;
    	return 0;
    }
    int chuqin(int x)//出勤 
    {
    	if(18<=x)return 5;
    	if(15<=x&&x<=17)return 4;
    	if(12<=x&&x<=14)return 3;
    	if(9<=x&&x<=11)return 2;
    	if(6<=x&&x<=8)return 1;
    	return 0;
    }
    int ti(int a,int b){return a*60+b;}//分钟转化为秒 
    int changpao(char x,int t)//长跑  
    {
    	int res=0;
    	if(x=='M')
    	{
    		if(t<=ti(18,0) )res=2;
    		if(t<=ti(17,10))res=4;
    		if(t<=ti(16,30))res=6;
    		if(t<=ti(15,50))res=8;
    		if(t<=ti(15,10))res=10;
    		if(t<=ti(14,30))res=12;
    		if(t<=ti(14,0) )res=14;
    		if(t<=ti(13,30))res=16;
    		if(t<=ti(13,0) )res=18;
    		if(t<=ti(12,30))res=20;
    	}
    	else 
    	{
    		if(t<=ti(9,0) )res=2;
    		if(t<=ti(8,50))res=4;
    		if(t<=ti(8,35))res=6;
    		if(t<=ti(8,20))res=8;
    		if(t<=ti(8,5) )res=10;
    		if(t<=ti(7,50))res=12;
    		if(t<=ti(7,31))res=14;
    		if(t<=ti(7,14))res=16;
    		if(t<=ti(6,57))res=18;
    		if(t<=ti(6,40))res=20;
    	}
    	return res;
    }
    /*------------以上是得分---------*/
    struct xuesheng//学生 
    {
    	int id,ans,cnt,tot,las;//ans:总得分 cnt和tot:出勤 las:最后一次合法记录时间 
    	char xb;//性别 
    	friend bool operator <(const xuesheng &x,const xuesheng &y)
    	{
    		return x.id<y.id;
    	}
    }a[N];
    void duru()
    {
    	int lin,x,y;char xxx[10];
    	cin>>n;
    	for(int i=1;i<=n;++i)
    	{
    		a[i].id=read();
    		
    		scanf("%s",xxx);
    		a[i].xb=xxx[0];
    
    		lin=read();a[i].ans+=lin;//体育课专项成绩
    
    		x=read();y=read();a[i].ans+=changpao(a[i].xb,ti(x,y));//长跑测试成绩
    		
    		scanf("%s",xxx);if(xxx[0]=='P')a[i].ans+=10;//体质测试成绩
    		
    		lin=read();a[i].ans+=lin;//期末检测成绩
    		a[i].cnt=read();//参加班级训练营的次数
    		a[i].las=-9999999;
    	}
    	sort(a+1,a+1+n);
    	for(int i=1;i<=n;++i)mp[a[i].id]=i;
    }
    int yyy[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};//记录每个月有多少天 
    int sj(int yue/*月*/,int ri/*日*/)//返回从1月1日0点到这一天有多少秒 
    {
    	int res=0;
    	for(int i=1;i<yue;++i)res+=yyy[i];
    	res+=ri;
    	return res*24*60*60;//秒 
    }
    int Ti(int a,int b,int c)//小时转化为秒 
    {
    	return a*3600+b*60+c;//秒 
    }
    void yang_guang_chang_pao()//处理阳光长跑数据 
    {
    	int rq,hao,t1,t2,t3,t4,t5,t6,t7,t8,stp,T1,T2,T;
    	long double jl;
    	cin>>m;
    	while(m--)
    	{
    		rq=read();rq%=10000;T=sj(rq/100,rq%100);//rq:日期 
    		hao=read();  hao=mp[hao];//学号 
    		t1=read();t2=read();t3=read();//开始时间 
    		t4=read();t5=read();t6=read();//结束时间 
    		cin>>jl;jl*=1000;//距离 
    		t7=read();t8=read();//暂停时间 
    		stp=read();
    		T1=Ti(t1,t2,t3);T2=Ti(t4,t5,t6);//转化为秒	
    		if((a[hao].xb=='M'&&jl<3000) || (a[hao].xb=='F'&&jl<1500))continue;//不符合要求1
    		if(jl/((LD)T2-T1) < 2 || jl/((LD)T2-T1) > 5)continue;//不符合要求2
    		if(ti(t7,t8)>ti(4,30))continue;//不符合要求3
    		if(jl/(LD)stp>1.5)continue;//不符合要求4
    		
    		
    		if(T + T1 - a[hao].las < Ti(6,0,0))continue;
    		++a[hao].tot;a[hao].las=T+T2;//记得更新最后一条合法记录的结束时间 
    	}
    }
    void shuchu()
    {
    	for(int i=1;i<=n;++i)
    	{
    		a[i].ans+=yangguang(a[i].tot); 
    		a[i].ans+=chuqin(a[i].cnt+a[i].tot);//出勤分数 
    		printf("%d %d ",a[i].id,a[i].ans);dengji(a[i].ans);
    		puts("");
    	}
    }
    int main()
    {
    	duru();//读入 
    	yang_guang_chang_pao();//处理阳光长跑的数据 
    	shuchu();//输出 
    	fclose(stdin);fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    设置页面标题title
    路由跳转,页面位置不在顶部
    PyTorch深度学习入门
    删除ubuntu后开机进入grub的解决办法
    研一上英语
    python中常用的几个函数的正确用法-lambda/filter/map/reduce
    【Python教程】 re 模块中findall() 函数返回值展现方式的用法详解
    【Python教程】5种常见字符串去除空格的操作方法
    对python中浅拷贝和深拷贝分析详细介绍
    Git使用
  • 原文地址:https://www.cnblogs.com/wljss/p/15018463.html
Copyright © 2011-2022 走看看