alt alt alt alt

///----------------主题部分------------------------------------------------------- 本题就是简单的模拟题

这题的关键在于同一个人在同一时段多次登录视作一次,所以我们只需要创建三个set数组分别存三个时段登陆的人,最后统计数量即可。(set数组自带去重功能) 注意: 1.分别判断时分秒比较麻烦,我们可以把登录时间都换算成秒就比较好判断。 2.用字符串输入日期和时间再取出的方式复杂,可以用scanf简化输入(具体见代码),scanf不能输入string 要用char数组代替。

//----------------接下来是代码部分-------------------------------------------------

//#include <algorithm>
#include <set>
#define ll long long

using namespace std;

char id[22];
int n,h,m;//数目,年份,月份
int year,month,day;//年月日
int hh,mm,ss;//时分秒					

set<string> morning;
set<string> lunch;
set<string> night;
//三个set记录早中晚登录的人

int main(){
	cin>>n>>h>>m;
	for(int i=1;i<=n;i++){
		scanf("%s %d-%d-%d %d:%d:%d",id,&year,&month,&day,&hh,&mm,&ss);
		//cout<<month<<" "<<hh;
		ss=hh*3600+mm*60+ss;//判断秒的范围即可
		if(year==h&&month==m){
			if(ss>=25200&&ss<=32400){
				morning.insert(id);
				//cout<<id<<endl;
			} 
			else if(ss>=64800&&ss<=72000){
				morning.insert(id);
				//cout<<id<<endl;
			}
			else if(ss>=39600&&ss<=46800){
				lunch.insert(id);
			}
			else if(ss>=79200&&ss<=86400){
				night.insert(id);
			}
			else if(ss<=3600){
				night.insert(id);
			}
		}
	}
	cout<<morning.size()<<" "<<lunch.size()<<" "<<night.size()<<endl;
	return 0;
}

//------------接下来是复盘错误----------------------------------------

复盘: 1.理解错题意,之前以为一个人在同一天同一时段多次登录才算一次,就去统计每天登录人数,就出错,还去判断隔天凌晨登录算作前一天的人数,就比较复杂 2.没有用set而是存个数组判断某个人是否出现过会超时,而且id是用字符串输入的很难去判断 3.id的范围大于long long 所以要用字符数组输入