「THUPC 2017」体育成绩统计Score 大模拟

    科技2024-12-05  37

    文章目录

    一.题目二.Solution三.Code四.大模拟小结

    一.题目

    题目太长了QWQ 传送门

    二.Solution

    第一眼看到这道题目,wdnm,题目是真的又臭又长,要求还很多,直接把我人给看傻了。但我也没办法,只能硬着头皮给看下去。因为没有什么思维含量,这里提供一些细节:

    长跑时间和休息时间如果没上两位数题目是只给一位数的,比如9’9’’,但别忘了还有89’45’'等情况;男女有别;分数没说的一律算0分,比如阳光长跑连三次都没有达到,就直接0分;阳光长跑的时间不会有跨天跨月或者跨年;两次阳光长跑之间的时间间隔是前一次的结束与后一次的开始之间的间隔(我就错这调了1h QWQ),如果是第一次,就直接通过;时间最好全部化成秒直接相减,包括天月都化成秒,月直接求个前缀和就行了。

    祝你好运。。。

    三.Code

    #include <cstdio> #include <cstring> #include <iostream> #include <map> using namespace std; #define LL long long struct node { bool sex; int grade, c, sun_run; LL lst_time; }; map <LL, node> mp; int n, m; LL a[4005], sum_month[20] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; int check_long_run (int sex, char *long_run){ int mi = (long_run[1] >= '0' && long_run[1] <= '9') ? ((long_run[0] - 48) * 10 + long_run[1] - 48) : (long_run[0] - 48); int se; if (mi >= 10 && long_run[4] >= '0' && long_run[4] <= '9') se = (long_run[3] - 48) * 10 + long_run[4] - 48; else if (mi >= 10) se = long_run[3] - 48; else if (long_run[3] >= '0' && long_run[3] <= '9') se = (long_run[2] - 48) * 10 + long_run[3] - 48; else se = long_run[2] - 48; if (sex == 1){ if (mi <= 12 && se <= 30) return 20; if ((mi == 12 && 30 < se && se <= 59) || (mi == 13 && se == 0)) return 18; if (mi == 13 && 0 < se && se <= 30) return 16; if ((mi == 13 && 30 < se && se <= 59) || (mi == 14 && se == 0)) return 14; if (mi == 14 && 0 < se && se <= 30) return 12; if ((mi == 14 && 30 < se && se <= 59) || (mi == 15 && 0 <= se && se <= 10)) return 10; if (mi == 15 && 10 < se && se <= 50) return 8; if ((mi == 15 && 50 < se && se <= 59) || (mi == 16 && 0 <= se && se <= 30)) return 6; if ((mi == 16 && 30 < se && se <= 59) || (mi == 17 && 0 <= se && se <= 10)) return 4; if ((mi == 17 && 10 < se && se <= 59) || (mi == 18 && se == 0)) return 2; return 0; } else{ if (mi <= 6 && se <= 40) return 20; if (mi == 6 && 40 < se && se <= 57) return 18; if ((mi == 6 && 57 < se && se <= 59) || (mi == 7 && 0 <= se && se <= 14)) return 16; if (mi == 7 && 14 < se && se <= 31) return 14; if (mi == 7 && 31 < se && se <= 50) return 12; if ((mi == 7 && 50 < se && se <= 59) || (mi == 8 && se <= 5)) return 10; if (mi == 8 && se <= 20) return 8; if (mi == 8 && se <= 35) return 6; if (mi == 8 && se <= 50) return 4; if ((mi == 8 && se <= 59) || (mi == 9 && se == 0)) return 2; return 0; } } bool check_stop (char *stop){ if (stop[1] >= '0' && stop[1] <= '9') return 0; if (stop[0] > '4') return 0; int mi = stop[0] - 48, se; if (stop[3] >= '0' && stop[3] <= '9') se = (stop[2] - 48) * 10 + stop[3] - 48; else se = stop[2] - 48; if ((mi == 4 && se <= 30) || mi < 4) return 1; return 0; } bool check_length (LL num, double length){ if (mp[num].sex == 1 && length >= 3.0) return 1; if (mp[num].sex == 0 && length >= 1.5) return 1; return 0; } bool check_v (double length, char *s, char *t){ double len = length * 1000; double stime = 0, ttime = 0, sh, sm, ss, th, tm, ts; sh = (s[0] - 48) * 10 + s[1] - 48, sm = (s[3] - 48) * 10 + s[4] - 48, ss = (s[6] - 48) * 10 + s[7] - 48; th = (t[0] - 48) * 10 + t[1] - 48, tm = (t[3] - 48) * 10 + t[4] - 48, ts = (t[6] - 48) * 10 + t[7] - 48; stime = sh * 3600 + sm * 60 + ss; ttime = th * 3600 + tm * 60 + ts; double v = len / (ttime - stime); if (2.0 <= v && v <= 5.0) return 1; return 0; } bool check_step (double length, double step){ double len = length * 1000; double v = len / step; if (v <= 1.5) return 1; return 0; } bool check_time (LL num, char *date, char *s, char *t){ int month = (date[4] - 48) * 10 + date[5] - 48; LL day = (date[6] - 48) * 10 + date[7] - 48; LL h = (s[0] - 48) * 10 + s[1] - 48; LL mi = (s[3] - 48) * 10 + s[4] - 48; LL se = (s[6] - 48) * 10 + s[7] - 48; LL start_time = (sum_month[month] + day - 1) * 86400 + (h - 1) * 3600 + (mi - 1) * 60 + se; h = (t[0] - 48) * 10 + t[1] - 48; mi = (t[3] - 48) * 10 + t[4] - 48; se = (t[6] - 48) * 10 + t[7] - 48; LL end_time = (sum_month[month] + day - 1) * 86400 + (h - 1) * 3600 + (mi - 1) * 60 + se; if (! mp[num].lst_time){ mp[num].lst_time = end_time; return 1; } else{ if (start_time - mp[num].lst_time >= 21600){ mp[num].lst_time = end_time; return 1; } } return 0; } int check_chuqing (int sum){ if (sum >= 18) return 5; if (sum >= 15) return 4; if (sum >= 12) return 3; if (sum >= 9) return 2; if (sum >= 6) return 1; return 0; } int check_sun_run (int sum){ if (sum >= 21) return 10; if (sum >= 19) return 9; if (sum >= 17) return 8; if (sum >= 14) return 7; if (sum >= 11) return 6; if (sum >= 7) return 4; if (sum >= 3) return 2; return 0; } int main (){ //freopen ("long_run.in", "r", stdin); //freopen ("long_run.out", "w", stdout); scanf ("%d", &n); for (int i = 1; i <= n; i ++){ LL num; char sex, long_run[10] = {}, t; int s, f, c; scanf ("%lld %c %d %s %c %d %d", &num, &sex, &s, long_run, &t, &f, &c); a[i] = num; if (sex == 'M') {mp[num].sex = 1; mp[num].grade += check_long_run (1, long_run);} else {mp[num].sex = 0; mp[num].grade += check_long_run (0, long_run);} mp[num].grade += s; if (t == 'P') mp[num].grade += 10; mp[num].grade += f; mp[num].c = c; } scanf ("%d", &m); while (m --){ char date[10] = {}, s[20] = {}, t[20] = {}, stop[10] = {}; LL num; double length, step; scanf ("%s%lld%s%s%lf%s%lf", date, &num, s, t, &length, stop, &step); if (check_stop (stop) && check_length (num, length) && check_v (length, s, t) && check_step (length, step)){ if (check_time (num, date, s, t)) mp[num].sun_run ++; } } for (int i = 1; i <= n; i ++){ LL num = a[i]; mp[num].grade += check_chuqing (mp[num].c + mp[num].sun_run) + check_sun_run (mp[num].sun_run); printf ("%lld %d", num, mp[num].grade); if (mp[num].grade >= 95) printf (" A\n"); else if (mp[num].grade >= 90) printf (" A-\n"); else if (mp[num].grade >= 85) printf (" B+\n"); else if (mp[num].grade >= 80) printf (" B\n"); else if (mp[num].grade >= 77) printf (" B-\n"); else if (mp[num].grade >= 73) printf (" C+\n"); else if (mp[num].grade >= 70) printf (" C\n"); else if (mp[num].grade >= 67) printf (" C-\n"); else if (mp[num].grade >= 63) printf (" D+\n"); else if (mp[num].grade >= 60) printf (" D\n"); else printf (" F\n"); } return 0; }

    四.大模拟小结

    做了这么多的大模拟,我的内心是绝望的,但也有一点通透的感觉。其实大模拟一般都是考你以下几点:

    年月日以及时间之间的转换(闰年,大月,小月)区间判断,判断是否在某个区间细节,if-else之间的关系混乱与否

    总之一点:做大模拟的时候要保持清醒,不慌不忙,一行一行稳扎稳打。(不然谁想调这又臭又长的代码)

    Processed: 0.014, SQL: 8