【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);
}
发表评论