题目
好久没敲过恶心的模拟题了,莫名有点怀念是什么鬼,我还记得我的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;
}