大模拟求调(样例AC)
查看原帖
大模拟求调(样例AC)
780641
WD2c0mP楼主2023/2/3 12:09

大模拟求调

#include <bits/stdc++.h>
using namespace std;
struct st{
	string na;
	int sc,ygcp,cqtm;
	bool x;
};
int M[11] = {0,750,780,810,840,870,910,950,990,1030,1080};
int F[11] = {0,400,417,434,451,470,485,500,515,530,540};
int ygcp_tm[11] = {0,21,19,17,14,11,7,3};
int cqcs[6] = {0,18,15,12,9,6};
int mo_qzh[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365};
int ygcp_sc(int x) {
	for (int i = 1;i <= 5;i ++) {
		if (x >= ygcp_tm[i]) return 10 - i + 1;
	}
	if (x >= 7) return 4;
	if (x >= 3) return 2;
	return 0;
}
int qmcp_sc(int a,int b,bool x) { //期末长跑 
	int tt = a * 60 + b;
	if (x) {for (int i = 1;i <= 9;i ++) if (tt <= M[i]) {/*cout << "qmcp note:" << i << endl;*/return 2 * (10 - i + 1);}}
	else {for (int i = 1;i <= 9;i ++) if (tt <= F[i]) return 2 * (10 - i + 1);}
	return 2;
}
int cal_cqcs(int x) {
	for (int i = 1;i <= 5;i ++) if (x >= cqcs[i]) return 5 - i + 1;
	return 0;
}
int cal_tim(int day,int hh,int mm,int ss) {
	day -= 20170000;
	int dd = day % 100;
	int mo = day / 100;
	dd = mo_qzh[mo] + dd;
	return dd * 86400 + hh * 3600 + mm * 60 + ss;
}
bool dis_ok(bool x,double dis) {
	if (x) return dis >= 3.000;
	else return dis >= 1.500;
}
string dengdi(int x) {
	if (x >= 95) return "A"; if (x >= 90) return "A-";if (x >= 85) return "B+";if (x >= 80) return "B";if (x >= 77) return "B-";if (x >= 73) return "C+";if (x >= 70) return "C";if (x >= 67) return "C-";if (x >= 63) return "D+";if (x >= 60) return "D";return "F";
}
st o[10010];
int las[10010]; 
map<string,int>mp;
char W; //垃圾字符 
int main(){
	int n;
	cin >> n;
	for (int i = 1;i <= n;i ++) {
		int mm,ss,sc1,sc2;
		cin >> o[i].na;
		mp[o[i].na] = i; //是第几个学生 
		char c,ok;
		cin >> c;
		if (c == 'M') o[i].x = 1; //性别 
		else o[i].x = 0;
		cin >> o[i].sc >> mm >> W >> ss >> W;
		//cout << "体育课:" << o[i].sc << "分" << endl; /**/
		o[i].sc += qmcp_sc(mm,ss,o[i].x); //期末长跑 
		//cout << "期末长跑:" << qmcp_sc(mm,ss,o[i].x) << "分" << endl; /**/
		cin >> ok >> sc1 >> sc2;
		if (ok == 'P') { 
			o[i].sc += 10; //通过考试? 
			//cout << "体质测试" << 10 << "分" << endl; /**/
		}
		else {
			//cout << "体质测试" << 10 << "分" << endl; /**/
		}
		o[i].cqtm = sc1;
		o[i].sc += sc2; //先把这个加了
		//cout << "期末测试" << sc2 << "分" << endl; 
	}
	memset(las,-1,sizeof(las));
	int m;
	cin >> m;
	for (int i = 1;i <= m;i ++) {
		int day;
		string nam;
		cin >> day >> nam;
		int hh,mm,ss,hh1,mm1,ss1,mm2,ss2,bu;
		double jl;
		cin >> hh >> W >> mm >> W >> ss >> hh1 >> W >> mm1 >> W >> ss1 >> jl >> mm2 >> W >> ss2 >> W >> bu; 
		int beg = cal_tim(day,hh,mm,ss); //时间1 
		int fin = cal_tim(day,hh1,mm1,ss1); //时间2 
		int j = mp[nam]; //第几个学生 
		if (mm2 * 60 + ss2 > 270) continue;
		if (las[j] != -1) {
			if (beg - las[j] < 21600) continue;
		}
		if (!dis_ok(o[j].x,jl)) continue;
		jl *= 1000;
		if (jl / bu > 1.5) continue;
		if (jl / (fin - beg) < 2 || jl  / (fin - beg) > 5) continue;
		las[j] = fin;
		o[j].ygcp ++;
	}
	//cout << o[1].ygcp << endl;
	for (int i = 1;i <= n;i ++) {
		o[i].sc += ygcp_sc(o[i].ygcp) + cal_cqcs(o[i].ygcp + o[i].cqtm);
		//cout << "阳光长跑" << ygcp_sc(o[i].ygcp) << "分" << endl;
		//cout << "出勤次数" << cal_cqcs(o[i].ygcp + o[i].cqtm) << "分" << endl;
		cout << o[i].na << " " << o[i].sc << " " << dengdi(o[i].sc) << endl;
	}
	return 0;
}
2023/2/3 12:09
加载中...