[LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)

题目
好久没敲过恶心的模拟题了,莫名有点怀念是什么鬼,我还记得我的zamjena
没啥想说的,这道题就是没智商有码力的
纯粹是纪念一下今天上午直接肝了的两个半小时,真的一点思维都不需要有,直接上!!
我的手都没停下过,无非难调了一点,经常打飞而已啦~
在这里插入图片描述

#include <map>
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 4005
#define MAXM 150005
#define int long long
struct node {
	int id, s, a, b, f, c, ans;
	char sex, test;
}s[MAXN];
struct noded {
	int date, sh, sm, ss, th, tm, ts, a, b, s;
	double l;
	noded() {
		sh = sm = ss = th = tm = ts = 0;
	}
}doc[MAXM];
vector < int > G[MAXN];
map < int, int > mp;
int n, m, ans;
int day[15];

int Run( char sex, int t ) {
	if( sex == 'M' ) {
		if( t <= 1230 ) return 20;
		if( t <= 1300 ) return 18;
		if( t <= 1330 ) return 16;
		if( t <= 1400 ) return 14;
		if( t <= 1430 ) return 12;
		if( t <= 1510 ) return 10;
		if( t <= 1550 ) return 8;
		if( t <= 1630 ) return 6;
		if( t <= 1710 ) return 4; 
		if( t <= 1800 ) return 2;
	}
	else {
		if( t <= 640 ) return 20;
		if( t <= 657 ) return 18;
		if( t <= 714 ) return 16;
		if( t <= 731 ) return 14;
		if( t <= 750 ) return 12;
		if( t <= 805 ) return 10;
		if( t <= 820 ) return 8;
		if( t <= 835 ) return 6;
		if( t <= 850 ) return 4;
		if( t <= 900 ) return 2;
	}
	return 0;
}

void init() {
	day[1] = day[3] = day[5] = day[7] = day[8] = day[10] = day[12] = 31;
	day[2] = 28;
	day[4] = day[6] = day[9] = day[11] = 30;
}

int Date( int s, int t ) {
	int sm = ( s % 10000 ) / 100, sd = s % 100;
	int tm = ( t % 10000 ) / 100, td = t % 100;
	int sums = sd, sumt = td;
	for( int i = 1;i < sm;i ++ )
		sums += day[i];
	for( int i = 1;i < tm;i ++ )
		sumt += day[i];
	return sumt - sums;
}

int Time( int i ) {
	int sh = doc[i].sh, sm = doc[i].sm, ss = doc[i].ss;
	int th = doc[i].th, tm = doc[i].tm, ts = doc[i].ts;
	if( sh > th ) th += 24;
	return th * 3600 + tm * 60 + ts - sh * 3600 - sm * 60 - ss;
}

int Time( int i, int j ) {
	int sh = doc[i].th, sm = doc[i].tm, ss = doc[i].ts;
	int th = doc[j].sh, tm = doc[j].sm, ts = doc[j].ss;
	int date = Date( doc[i].date, doc[j].date );
	th += date * 24;
	if( th < sh ) return 0;
	return th * 3600 + tm * 60 + ts - sh * 3600 - sm * 60 - ss;
}

int shine( int u ) {
	int tot = 0, last = 0;
	for( int v = 0;v < G[u].size();v ++ ) {
		int i = G[u][v];
		doc[i].l *= 1000;
		if( doc[i].l < 3000 && s[u].sex == 'M' ) continue;
		if( doc[i].l < 1500 && s[u].sex == 'F' ) continue;
		if( doc[i].l / Time( i ) < 2 || doc[i].l / Time( i ) > 5 ) continue;
		if( doc[i].a * 60 + doc[i].b > 270 ) continue;
		if( doc[i].l / doc[i].s > 1.5 ) continue;
		if( Time( last, i ) < 21600 ) continue;
		tot ++, last = i;
	}
	return tot;
}

int SunRun( int x ) {
	if( x >= 21 ) return 10;
	if( x >= 19 ) return 9;
	if( x >= 17 ) return 8;
	if( x >= 14 ) return 7;
	if( x >= 11 ) return 6;
	if( x >= 7 ) return 4;
	if( x >= 3 ) return 2;
	return 0;
}

int Item( int x ) {
	if( x >= 18 ) return 5;
	if( x >= 15 ) return 4;
	if( x >= 12 ) return 3;
	if( x >= 9 ) return 2;
	if( x >= 6 ) return 1;
	return 0;
}

void Grade( int x ) {
	if( x >= 95 ) printf( "A\n" );
	else if( x >= 90 ) printf( "A-\n" );
	else if( x >= 85 ) printf( "B+\n" );
	else if( x >= 80 ) printf( "B\n" );
	else if( x >= 77 ) printf( "B-\n" );
	else if( x >= 73 ) printf( "C+\n" );
	else if( x >= 70 ) printf( "C\n" );
	else if( x >= 67 ) printf( "C-\n" );
	else if( x >= 63 ) printf( "D+\n" );
	else if( x >= 60 ) printf( "D\n" );
	else printf( "F\n" );
}

signed main() {
	init();
	scanf( "%lld", &n );
	for( int i = 1;i <= n;i ++ ) {
		char pun;
		scanf( "%lld %c %lld %lld%c%lld%c %c %lld %lld", &s[i].id, &s[i].sex, &s[i].s, &s[i].a, &pun, &s[i].b, &pun, &s[i].test, &s[i].f, &s[i].c );
		ans = 0;
		ans += s[i].s;
		ans += Run( s[i].sex, s[i].a * 100 + s[i].b );
		if( s[i].test == 'P' ) ans += 10;
		s[i].ans = ans;
		mp[s[i].id] = i;
	}
	scanf( "%lld", &m );
	for( int i = 1, id;i <= m;i ++ ) {
		char pun;
		scanf( "%lld %lld %lld:%lld:%lld %lld:%lld:%lld %lf %lld%c%lld%c %lld", &doc[i].date, &id, &doc[i].sh, &doc[i].sm, &doc[i].ss, &doc[i].th, &doc[i].tm, &doc[i].ts, &doc[i].l, &doc[i].a, &pun, &doc[i].b, &pun, &doc[i].s );
		G[mp[id]].push_back( i );
	}
	for( int i = 1;i <= n;i ++ ) {
		int tot = shine( i );
		s[i].ans += SunRun( tot );
		s[i].ans += Item( tot + s[i].c ) + s[i].f;
	}
	for( int i = 1;i <= n;i ++ )
		printf( "%lld %lld ", s[i].id, s[i].ans ), Grade( s[i].ans );
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值