PAT甲级 1095 Cars on Campus(超时问题的过来看看)

题目信息 https://pintia.cn/problem-sets/994805342720868352/problems/994805371602845696
算法策略
1、把所有记录根据plate_num排列在一起,然后同一辆车按照时间早晚顺序排序。具体就是cmp

bool cmp(record a,record b)
{
	if(a.ID

2、统计有效的等级信息,前一个是in,下一个是out,才符合条件,放入到容器中。
3、先读入query,然后统计每个query是否在每个停车时间内。in时间为a,out时间为b,则[a,b)左闭右开有效。
划重点 此处必须是只统计query内需要询问的记录,(而不是全部枚举,最后取有效信息读出,这样会超时)。
4、统计每辆车在一天内停放的总时间,然后找出停放时间最大值,再次枚举找出符合条件的车,最后按照字典顺序对plate_num排序输出即可。

/**
* Copyright(c)
* All rights reserved.
* Author : csdn写完这道题就睡觉
* Description : JZU PAT test Level: A 
*/
#include 
#include 
#include 
#include 
using namespace std;
struct record{
	string ID;
	int hour;
	int min;
	int sec;
	char state[4];
	bool b;
};
struct car_record{
	string ID;
	int in_hour;
	int in_min;
	int in_sec;
	int out_hour;
	int out_min;
	int out_sec;
	int stop_time; //停车时间 
};
vector<record> v;
vector<car_record> records; 
int n,k;
vector<string> ans;
struct park{
	string ID;
	int t;
}; 
map<string,park> park_time; 
string cars[10001];
int num[90000]={0};
vector<int> query;
bool cmp(record a,record b)
{
	if(a.ID<b.ID)
		return true;
	if(a.ID==b.ID&&a.hour<b.hour)
		return true;
	if(a.ID==b.ID&&a.hour==b.hour&&a.min<b.min)
		return true;
	if(a.ID==b.ID&&a.hour==b.hour&&a.min==b.min&&a.sec<b.sec)
		return true;
	return false;				
}
bool cmp2(string a,string b)
{
	return a<b;
}
int main()
{
	cin>>n>>k;
	record temp;
	char str[10]; 
	for(int i=0;i<n;i++)
	{
		scanf("%s",str);
		temp.ID=string(str);
		scanf("%d:%d:%d %s",&temp.hour,&temp.min,&temp.sec,temp.state);
		v.push_back(temp);	
	}
	sort(v.begin(),v.end(),cmp); //根据plate_number排序
	int i=1,j;
	car_record car;
	while(i<n)
	{
		if(v[i].ID==v[i-1].ID&&v[i].state[0]=='o'&&v[i-1].state[0]=='i')
		{
			car.ID=v[i].ID;
			car.in_hour=v[i-1].hour;
			car.in_min=v[i-1].min;
			car.in_sec=v[i-1].sec;
			car.out_hour=v[i].hour;
			car.out_min=v[i].min;
			car.out_sec=v[i].sec;
			records.push_back(car);
			park_time[car.ID].t=0;  //初始化停车时间
			park_time[car.ID].ID=car.ID; 
			i+=2;				
		}
		else
		i++;				
	}
	int h,m,s,t;
	for(i=0;i<k;i++)
	{
		scanf("%d:%d:%d",&h,&m,&s);
		t=h*3600+m*60+s;
		query.push_back(t);
	}
	int max_time=0;
	for(j=0;j<records.size();j++)
	{
		int a=records[j].in_hour*60*60+records[j].in_min*60+records[j].in_sec;
		int b=records[j].out_hour*60*60+records[j].out_min*60+records[j].out_sec;
		for(i=0;i<query.size();i++)
			if(query[i]>=a&&query[i]<b)
			num[query[i]]++;
		records[j].stop_time=b-a;
		park_time[records[j].ID].t+=records[j].stop_time;
	}
	for(int i=0;i<k;i++)
	{
		printf("%d\n",num[query[i]]);
	}
	
	map<string,park>::iterator it;
	for(it=park_time.begin();it!=park_time.end();it++)
	{
		if(max_time<it->second.t)
			max_time=it->second.t;	//最大停车时间 
	}
	for(it=park_time.begin();it!=park_time.end();it++)
	{
		if(it->second.t==max_time)
			ans.push_back(it->second.ID);
	}
	sort(ans.begin(),ans.end(),cmp2);
	for(i=0;i<ans.size();i++)
	{
		cout<<ans[i]<<" ";
	}
	s=max_time%60;
	max_time/=60;
	m=max_time%60;
	max_time/=60;
	h=max_time;
	printf("%02d:%02d:%02d\n",h,m,s);	
     return 0;
}

你可能感兴趣的:(PAT,OJ试题)