玄关 程序不知道哪里出现了UB(Undefined Behavior)求调
查看原帖
玄关 程序不知道哪里出现了UB(Undefined Behavior)求调
970132
Hero_Broom楼主2024/6/9 13:27
//fc "D:\My CPP FILES!!!\luogu.com.cn\P7426_1.out" "E:\Google Downloads\1.ans"
#include<bits/stdc++.h>
using namespace std;
int string_to_int(string);
int day_to_int(int s){
	int mon=s/100,day=s%100;
	int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int res=0;
	for(int i=1;i<=mon-1;i++) res+=month[i];
	res+=day;
	return res;
}
struct record{
	int date=0;
	long long number=0;
	int start_time=0,end_time=0;
	int total_time=0;
	int run_dis=0;
	int pause_time=0;
	int step_num=0;
};
struct student{
	long long number=0;
	bool male=0;
	int P_E_score=0;
	int long_run_time=0,long_run_score=0;
	vector<record> run_re;
	int sunny_run_score=0;
	int ok_time,class_training_time=0;
	inline int get_stopping_time(int i,int last){
//		printf("get_stopping_time:i=%d\tlast=%d\n",i,last);
		return run_re[i].start_time-run_re[last].end_time;
	}
	void get_sunny_run_score(){
		ok_time=0;
		int last=-1;
		for(int i=0;i<=run_re.size();i++){
			if(run_re[i].run_dis<(male?3000:1500)) continue;
			if(run_re[i].run_dis*1.0/run_re[i].total_time<2||run_re[i].run_dis*1.0/run_re[i].total_time>5) continue;
			if(run_re[i].pause_time>270) continue;
			if(run_re[i].run_dis*1.0/run_re[i].step_num>1.5) continue;
			if(i==0||last==-1){
//				printf("all accept!!!\ti=%d\n",i);
				ok_time++;
				last=i;
				continue;
			}
			if(run_re[i].date!=run_re[last].date){
				if(day_to_int(run_re[i].date)-day_to_int(run_re[last].date)>1){
//					printf("all accept!!!\ti=%d\n",i);
					ok_time++;
					last=i;
					continue;
				}
				if(run_re[i].start_time+24*3600-run_re[last].end_time>=6*3600){
//					printf("all accept!!!\ti=%d\n",i);
					ok_time++;
					last=i;
					continue;
				}
			}else{
				if(get_stopping_time(i,last)>=3600*6){
//					printf("all accept!!!\ti=%d\n",i);
					ok_time++;
					last=i;
					continue;
				}
			}
//			printf("i=%d\tlast=%d\tOops there's only one condition you didn't accepted!!!\n",i,last);
		}
		if(ok_time<=2) sunny_run_score=0;
		else if(ok_time<=6) sunny_run_score=2;
		else if(ok_time<=10) sunny_run_score=4;
		else if(ok_time<=13) sunny_run_score=6;
		else if(ok_time<=16) sunny_run_score=7;
		else if(ok_time<=18) sunny_run_score=8;
		else if(ok_time<=20) sunny_run_score=9;
		else sunny_run_score=10;
	}
	int body_score=0;
	int go_out=0,go_out_score=0,final_exam=0;
	int total=0;
	string grade="";
};
int n,m;
student st[10010];
string tmp;
record rp;
bool cmp(student a,student b){
	return a.number<b.number;
}
inline int change(int m,int s){return m*60+s;}
int pn,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
char c,cc;
int main(){
//	freopen("P7426_1.in","r",stdin);
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++){
		scanf("%lld %c %d %d'%d\" %c %d %d",&st[i].number,&c,&st[i].P_E_score,&t1,&t2,&cc,&st[i].final_exam,&st[i].class_training_time);
		st[i].male=(c=='M');
		st[i].run_re.clear();
		st[i].long_run_time=t1*60+t2;
		st[i].body_score=(cc=='P')*10;
		if(st[i].male){
			if(st[i].long_run_time<=change(12,30)) st[i].long_run_score=20;
			else if(st[i].long_run_time<=change(13,0)) st[i].long_run_score=18;
			else if(st[i].long_run_time<=change(13,30)) st[i].long_run_score=16;
			else if(st[i].long_run_time<=change(14,0)) st[i].long_run_score=14;
			else if(st[i].long_run_time<=change(14,30)) st[i].long_run_score=12;
			else if(st[i].long_run_time<=change(15,10)) st[i].long_run_score=10;
			else if(st[i].long_run_time<=change(15,50)) st[i].long_run_score=8;
			else if(st[i].long_run_time<=change(16,30)) st[i].long_run_score=6;
			else if(st[i].long_run_time<=change(17,10)) st[i].long_run_score=4;
			else if(st[i].long_run_time<=change(18,0)) st[i].long_run_score=2;
			else st[i].long_run_score=0;
		}else{
			if(st[i].long_run_time<=change(6,40)) st[i].long_run_score=20;
			else if(st[i].long_run_time<=change(6,57)) st[i].long_run_score=18;
			else if(st[i].long_run_time<=change(7,14)) st[i].long_run_score=16;
			else if(st[i].long_run_time<=change(7,31)) st[i].long_run_score=14;
			else if(st[i].long_run_time<=change(7,50)) st[i].long_run_score=12;
			else if(st[i].long_run_time<=change(8,5)) st[i].long_run_score=10;
			else if(st[i].long_run_time<=change(8,20)) st[i].long_run_score=8;
			else if(st[i].long_run_time<=change(8,35)) st[i].long_run_score=6;
			else if(st[i].long_run_time<=change(8,50)) st[i].long_run_score=4;
			else if(st[i].long_run_time<=change(9,0)) st[i].long_run_score=2;
			else st[i].long_run_score=0;
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d %lld %d:%d:%d %d:%d:%d %d.%d %d'%d\" %d",&rp.date,&rp.number,&t1,&t2,&t3,&t4,&t5,&t6,&t9,&t10,&t7,&t8,&rp.step_num);
//		if(rp.number==2015010008)
//		printf("%d %lld %d:%d:%d %d:%d:%d %d.%d %d'%d\" %d\n",rp.date,rp.number,t1,t2,t3,t4,t5,t6,t9,t10,t7,t8,rp.step_num);
		pn=0;
		for(int j=1;j<=n;j++)
			if(st[j].number==rp.number){
				pn=j;
				break;
			}
		rp.run_dis=t9*1000+t10*10;
		rp.date-=20170000;
		rp.start_time=t1*3600+t2*60+t3;
		rp.end_time=t4*3600+t5*60+t6;
		rp.pause_time=t7*60+t8;
		rp.total_time=rp.end_time-rp.start_time;
		st[pn].run_re.push_back(rp);
	}
//	freopen("P7426_1.out","w",stdout);
	for(int i=1;i<=n;i++){
		st[i].get_sunny_run_score();
		st[i].go_out=st[i].class_training_time+st[i].ok_time;
		if(st[i].go_out<=5) st[i].go_out_score=0;
		else if(st[i].go_out<=8) st[i].go_out_score=1;
		else if(st[i].go_out<=11) st[i].go_out_score=2;
		else if(st[i].go_out<=14) st[i].go_out_score=3;
		else if(st[i].go_out<=17) st[i].go_out_score=4;
		else st[i].go_out_score=5;
//		printf("i=%d\tP.E.=%d\tsunny run=%d\tlong_run=%d\tbody=%d\tfinal=%d\tgo=%d\n",i,st[i].P_E_score,st[i].sunny_run_score,st[i].long_run_score,st[i].body_score,st[i].final_exam,st[i].go_out_score);
		st[i].total=st[i].P_E_score+st[i].sunny_run_score+st[i].long_run_score+st[i].body_score+st[i].final_exam+st[i].go_out_score;
	}
	sort(st+1,st+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(st[i].total>=95) st[i].grade="A";
		else if(st[i].total>=90) st[i].grade="A-";
		else if(st[i].total>=85) st[i].grade="B+";
		else if(st[i].total>=80) st[i].grade="B";
		else if(st[i].total>=77) st[i].grade="B-";
		else if(st[i].total>=73) st[i].grade="C+";
		else if(st[i].total>=70) st[i].grade="C";
		else if(st[i].total>=67) st[i].grade="C-";
		else if(st[i].total>=63) st[i].grade="D+";
		else if(st[i].total>=60) st[i].grade="D";
		else if(st[i].total>=0) st[i].grade="F";
		cout<<st[i].number<<" "<<st[i].total<<" "<<st[i].grade<<endl;
	}
}
2024/6/9 13:27
加载中...