WA求助
查看原帖
WA求助
816204
Light_LE楼主2025/8/3 17:01
#include <bits/stdc++.h>
#define maxn 10003
using namespace std;
struct Data {
	int id,
		sex,// M->1, F->0
		score,
		last,// 阳光长跑上次合法时间
		tmp,// 班级训练营参加次数 
		cnt;
	string rank;
}stu[maxn];

int n, m;
int a[] = {0, 31, 28, 31, 30, 31, 30, 31, 31 ,30, 31 ,30, 31};
map<int, int> get_index;
int sec(int h, int m, int s) {// 一天内的第几秒 
	return h * 3600 + m * 60 + s;
}
int sec(int mon, int d, int h, int min, int s) {// 一年内的第几秒 
	int day = 0;
	for (int i = 1; i < mon; i++){
		day += a[i];
	}
	day += d - 1;
	return day * sec(24, 0, 0) + sec(h, min, s);
}
bool cmp(Data x, Data y) {
	return x.id < y.id;
}
int main() {
	//freopen(".in", "r", stdin); 
	//freopen(".out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> n; 
	for (int i = 0; i < n; i++) {
		int id, x, y;
		char MF, PF;
		string time;
		
		cin >> id >> MF >> x >> time >> PF >> y >> stu[i].tmp;
		stu[i].id = id;
		get_index[id] = i;
		stu[i].score += x + y + (PF == 'P'?10:0);
		stu[i].sex = (MF == 'M'?1:0); 
		
		int a, b;
		sscanf(time.c_str(), "%d\'%d\"", &a, &b);
		int s = sec(0, a, b);
		if (MF == 'M') {// M
			if (s <= sec(0, 12, 30)) stu[i].score += 20;
			else if (s <= sec(0, 13, 0)) stu[i].score += 18;
			else if (s <= sec(0, 13, 30)) stu[i].score += 16;
			else if (s <= sec(0, 14, 0)) stu[i].score += 14;
			else if (s <= sec(0, 14, 30)) stu[i].score += 12;
			else if (s <= sec(0, 15, 10)) stu[i].score += 10;
			else if (s <= sec(0, 15, 50)) stu[i].score += 8;
			else if (s <= sec(0, 16, 30)) stu[i].score += 6;
			else if (s <= sec(0, 17, 10)) stu[i].score += 4;
			else if (s <= sec(0, 18, 0)) stu[i].score += 2;
		}
		else{// F
			if (s <= sec(0, 6, 40)) stu[i].score += 20;
			else if (s <= sec(0, 6, 57)) stu[i].score += 18;
			else if (s <= sec(0, 7, 14)) stu[i].score += 16;
			else if (s <= sec(0, 7, 31)) stu[i].score += 14;
			else if (s <= sec(0, 7, 50)) stu[i].score += 12;
			else if (s <= sec(0, 8, 5)) stu[i].score += 10;
			else if (s <= sec(0, 8, 20)) stu[i].score += 8;
			else if (s <= sec(0, 8, 35)) stu[i].score += 6;
			else if (s <= sec(0, 8, 50)) stu[i].score += 4;
			else if (s <= sec(0, 9, 0)) stu[i].score += 2;
		}
	}
	
	cin >> m;
	for (int j = 0; j < m; j++) {
		string date/*完成日期*/, start, end, time;
		double dis;
		int id, x;
		
		cin >> date >> id >> start >> end >> dis >> time >> x;
		dis *= 1000.0;
		int i = get_index[id];
		
		if (stu[i].sex == 1){// M
			if (dis < 3000.0) continue;
		}
		else {// F
			if (dis < 1500.0) continue;
		}
		
		int mon2, day2, h2, m2, s2;// end
		sscanf(end.c_str(), "%d:%d:%d", &h2, &m2, &s2);
		mon2 = (date[4] - '0') * 10 + date[5] - '0';
		day2 = (date[6] - '0') * 10 + date[7] - '0';
		cout << mon2<<day2 << endl;
		
		int mon1, day1, h1, m1, s1;// start
		sscanf(start.c_str(), "%d:%d:%d", &h1, &m1, &s1);
		if (sec(h1, m1, s1) > sec(h1, m2, s2)) {
			if (day2 == 1) {
				mon1 = mon2 - 1;
				day1 = a[mon2];
			}
			else {
				mon1 = mon2;
				day1 = day2 - 1;
			}
		}
		
		double v = dis / (sec(mon2, day2, h2, m2, s2) - sec(mon1, day1, h1, m1, s1));
		if (!(v >= 2.0 && v <= 5.0)) continue;
		
		int a, b;
		sscanf(time.c_str(), "%d\'%d\"", &a, &b);
		if (!(sec(0, a, b) <= sec(0, 4, 30))) continue;
		
		if (dis / (double)x > 1.5) continue;
		
		if (sec(mon1, day1, h1, m1, s1) - stu[i].last < sec(6, 0, 0)) continue;
		
		// 合法
		stu[i].cnt++;
		stu[i].last = sec(mon2, day2, h2, m2, s2);
	}
	
	for (int i = 0; i < n; i++) {
		if (stu[i].cnt >= 21) stu[i].score += 10;
		else if (stu[i].cnt >= 19) stu[i].score += 9;
		else if (stu[i].cnt >= 17) stu[i].score += 8;
		else if (stu[i].cnt >= 14) stu[i].score += 7;
		else if (stu[i].cnt >= 11) stu[i].score += 6;
		else if (stu[i].cnt >= 7) stu[i].score += 4;
		else if (stu[i].cnt >= 3) stu[i].score += 2;
	}
	for (int i = 0; i < n; i++) {
		stu[i].cnt += stu[i].tmp;
		
		if (stu[i].cnt >= 18) stu[i].score += 5;
		else if (stu[i].cnt >= 15) stu[i].score += 4;
		else if (stu[i].cnt >= 12) stu[i].score += 3;
		else if (stu[i].cnt >= 9) stu[i].score += 2;
		else if (stu[i].cnt >= 6) stu[i].score += 1;
	}
	
	for (int i = 0; i < n; i++) {
		if (stu[i].score >= 95) stu[i].rank = "A";
		else if (stu[i].score >= 90) stu[i].rank = "A-";
		else if (stu[i].score >= 85) stu[i].rank = "B+";
		else if (stu[i].score >= 80) stu[i].rank = "B";
		else if (stu[i].score >= 77) stu[i].rank = "B-";
		else if (stu[i].score >= 73) stu[i].rank = "C+";
		else if (stu[i].score >= 70) stu[i].rank = "C";
		else if (stu[i].score >= 67) stu[i].rank = "C-";
		else if (stu[i].score >= 63) stu[i].rank = "D+";
		else if (stu[i].score >= 60) stu[i].rank = "D";
		else if (stu[i].score >= 0) stu[i].rank = "F";
	}
	
	sort(stu, stu + n, cmp);
	for (int i = 0; i < n; i++) {
		cout << stu[i].id << " " << stu[i].score << " " << stu[i].rank << "\n";
	}
	return 0;
}
2025/8/3 17:01
加载中...