【long long 坑】‘早自习打卡’

Description
重庆游戏与电子竞技大学开始使用电子打卡机进行早自习考勤,打卡机记录了每个人到达教室和离开教室的时间。现在辅导员想知道今天有多少同学在7:20之前(包括7:20)到达,7:40之后(包括7:40)离开,且这段时间内没有离开过教室的同学有多少,但是考勤记录被打乱了,于是他把这个任务交给了你。
Input
每个输入包含一个测试用例。 每个测试用例由多行记录组成,每行记录由时间(以h:m的形式,h(1<=h<=24)表示小时,m(0<=m<60)表示分钟)和学号s(s由十位数字组成)组成。 输入保证记录由合法的记录打乱得到,即同一个人时间轴上第一次记录一定是到达记录,相邻两次记录一定是一次到达一次离开。 记录最多有100000行。
Output
输出一个整数,表示在7:20之前(包括7:20)到达,7:40之后(包括7:40)离开,且这段时间内没有离开过教室的同学的数量。
Sample Input
7:19 2015233333
7:40 2015666666
7:20 2015666666
7:39 2015233333
7:00 2015123456
Sample Output
1

把学号离散化,但学号已经超过了1e10,所以要用long long

#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
map<ll, int> id;
priority_queue<int,vector<int> ,greater<int > > tl[100010];
int ans=0,cnt=0;
int main()
{
	int h,m;
	ll s;
	while(scanf("%d:%d %lld",&h,&m,&s)!=EOF)
	{
		if(id.count(s)==0)
		{
			id[s]=++cnt;
		}
		tl[id[s]].push(h*100+m);
	}
	int a,b;
	for(int i=1;i<=cnt;i++)
	{
		int card=tl[i].size();
		while(card>1)
		{
			a=tl[i].top();tl[i].pop();
			b=tl[i].top();tl[i].pop();
			card-=2;
			if(a<=720&&b>=740)
			{
				ans++;
				break;
			}
		}
	}
	printf("%d",ans);
}

 

发表评论