L2-055 胖达的山头
解题思路
先把时间换算成秒,输入的时候可以用scanf,然后用一个cnt[100010],一天有86400秒,数组大小足够,然后对于开始时间st,cnt[st]++,对于结束时间ed,cnt[ed+1]-- , 这里的ed+1是因为,题目要求任意一个时刻都不能同时有多个熊猫,所以只有在ed+1的时刻,该熊猫才会消失。
在遍历整个数轴的时候,不断地加cnt[i],取每个时刻的最大值。这样来看其实就是差分,将一个区间的变化,变成2个点的变化,求它的前缀和能得到每一时刻的熊猫有多少个,可以想一下这个图。
ac✅️代码
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int cnt[100010] ;
int main()
{
int n;cin>>n;
for(int i = 0 ; i < n ; i++)
{
int hh,mm,dd,hh1,mm1,dd1;
scanf("%d:%d:%d %d:%d:%d",&hh,&mm,&dd,&hh1,&mm1,&dd1);
int st = hh * 3600 + mm * 60 + dd;
int ed = hh1 * 3600 + mm1 * 60 + dd1;
cnt[st]++;
cnt[ed + 1] --;
}
int cur = 0;
int ans = 0;
for(int i = 0 ; i <= 86400; i++)
{
cur += cnt[i];
ans = max(cur,ans);
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号