【求调】WA#1,悬赏5元
查看原帖
【求调】WA#1,悬赏5元
455474
lailai0916楼主2024/1/14 00:49
  • 题目里说“按学号字典序给出”和“按开始时间顺序给出”,是否需要重新排序?
#include <bits/stdc++.h>
#define f(x,y) (x*60+y)
#define g(x,y,z) (x*3600+y*60+z)
using namespace std;

using ll=long long;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const int N=10005;
int day[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};//每个月月1日之前的天数 
int sun[2][7]={{21,19,17,14,11,7,3},{10,9,8,7,6,4,2}};
int plan[2][5]={{18,15,12,9,6},{5,4,3,2,1}};
int test[3][10]={{f(12,30),f(13,0),f(13,30),f(14,0),f(14,30),f(15,10),f(15,50),f(16,30),f(17,10),f(18,0)},
                 {f(6,40),f(6,57),f(7,14),f(7,31),f(7,50),f(8,5),f(8,20),f(8,35),f(8,50),f(9,0)},
				 {20,18,16,14,12,10,8,6,4,2}};
pair<int,string> level[11]={{95,"A"},{90,"A-"},{85,"B+"},{80,"B"},{77,"B-"},{73,"C+"},{70,"C"},{67,"C-"},{63,"D+"},{60,"D"},{0,"F"}};
map<ll,int> mp;//学号查编号 
struct Run
{
	int time1,time2;//开始时间、结束时间 
	int len;//以米为单位的跑步距离 
	int wait;
	int step;
};
struct Stu
{
	ll id;
	char sex;//性别 
	int score;
	int time;
	int cnt1,cnt2;//班级训练营、阳光长跑次数 
	vector<Run> v;//跑步记录 
}P[N];
bool check(Run x,char sex)//判断除时间间隔因素外,阳光长跑是否合法 
{
	int T=x.time2-x.time1-x.wait;//实际跑步时间 
	if(x.len<(sex=='M'?3000:1500))return 0;
	if(x.wait>f(4,30))return 0;
	if(T*2>x.len||T*5<x.len)return 0; 
	if(x.len*1.0/x.step+eps<1.5)return 0;
	return 1;
}
int main()
{
	int n,m;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		char t1;
		int a,b,t2;
		scanf("%lld%*c%c%d%d%*c%d%*c%*c%c%d%d",&P[i].id,&P[i].sex,&P[i].score,&a,&b,&t1,&t2,&P[i].cnt1);
		P[i].time=f(a,b);
		P[i].score+=(t1=='P'?10:0)+t2;
		mp[P[i].id]=i;
	}
	scanf("%d",&m);
	while(m--)
	{
		ll id;
		int date,h1,m1,s1,h2,m2,s2,a,b,step;
		double len;
		scanf("%d%lld%d%*c%d%*c%d%d%*c%d%*c%d%lf%d%*c%d%*c%d",&date,&id,&h1,&m1,&s1,&h2,&m2,&s2,&len,&a,&b,&step);
		int tmp=(day[date%10000/100]+date%100)*86400;//1月1日到当天的秒数 
		Run S={tmp+g(h1,m1,s2),tmp+g(h2,m2,s2),(int)((len+eps)*1000),f(a,b),step};
		P[mp[id]].v.push_back(S);
	}
	for(int i=1;i<=n;i++)
	{
		Run last={-inf,-inf};//上一次合法的阳光长跑 
		for(Run x:P[i].v)
		{
			if(!check(x,P[i].sex))continue;
			if(x.time1-last.time2>=21600)//时间间隔6小时以上 
			{
				P[i].cnt2++;
				last=x;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<10;j++)if(P[i].time<=test[P[i].sex=='F'][j]){P[i].score+=test[2][j];break;}
		for(int j=0;j<7;j++)if(P[i].cnt2>=sun[0][j]){P[i].score+=sun[1][j];break;}
		for(int j=0;j<5;j++)if(P[i].cnt1+P[j].cnt2>=plan[0][j]){P[i].score+=plan[1][j];break;}
		printf("%lld %d ",P[i].id,P[i].score);
		for(int j=0;j<11;j++)if(P[i].score>=level[j].first){cout<<level[j].second<<'\n';break;}
	}
	return 0;
}
2024/1/14 00:49
加载中...