昨天打了这场比赛,发现这个题是我们没写出来的题里面最简单的,但是我们死磕到最后也没有给这个题写出来。
每一个黎明
我更多一点地生活在过去
因为每一个夜晚
我更多一点地死在未来
boss统计出了每个人在实验室的时间表,希望你能根据统计表计算出实验室最多有多少人。
时间表有n行,每行有两个数,分别表示从哪天开始就一直在实验室,以及从哪天开始离开实验室。
第一行一个正整数 n,表示统计表的行数。接下来n行,每行两个正整数x,y,x表示从哪天开始就在实验室(包括x天),y表示从哪天开始离开实验室(y天一开始就离开实验室了)。
1<n<=1e6;1<=x,y<=1e9;
输入4 输出 3
1 2
2 5
3 5
4 5
可以通过题目发现范围是很大的,暴力的话超时是必然的。比赛的时候我们想了很多种方法,二分啊,模拟啊等等方法,最后还是没有写出来,比赛完看了题解豁然开朗,醍醐灌顶,就是给他们排序一下,其中运用到了pair,vector,sort自定义排序的知识;将它们进来标记为1,出去标记为2,而后我们只需要找到最多的1就能找到实验室最多有多少人;
#include <bits/stdc++.h>
#define int long long
#define PII pair<int,int>//这里直接定义一下,能省不少功夫
using namespace std;
bool cmp (PII q,PII w)
{
if (q.first!=w.first)
return q.first<w.first;
return q.second<w.second;
}//这里自定义排序一下
void solve ()
{
int t;cin>>t;
vector<PII>a;//这里用到了pair方便标记1,2;
for (int i=1;i<=t;i++)
{
int x,y;cin>>x>>y;
a.push_back({x,1});
a.push_back({y,2});//这里是stl里面的知识
}
sort (a.begin(),a.end(),cmp);
int ans=INT_MIN,ma=0;
for (PII q : a )//这里是对vector数组的遍历,注意dev要换成c++11才能运行
{
if (q.second==1)ma++;
else ma--;
ans=max(ans,ma);//遍历找出出现最多的1,输出即可
}
cout<<ans;
}
signed main ()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
while (T--) solve ();//为什么这样写我也不知道,跟着学长的模板走的
return 0;
}