Question:
小度每天早上要和小猫一起跑步。小猫的位置数值越小表示越在后面,速度越小表示越慢,它们都向一个方向跑。
小猫比较喜欢一起跑,所以当速度更快的小猫遇见速度慢的小猫时,它就会放慢速度,变成一组一起跑。注意,初始位置相同的小猫直接组成一组。
请问最终不再有追赶上的情况时,最多一组有多少只小猫?
格式
输入格式:
第一行输入的是整数 n,1≤n≤10^5;
接下来的n行分别包含小猫的初始位置 p 和速度 v ,1≤p,v≤10^8。
输出格式:
一行,一个数字,表示最多有多少小猫在一组。
样例 1
输入:
5
6 1
1 1
3 2
1 2
2 3
输出:
3
备注
样例解释:位置速度为(3,2),(2,3)的小猫会追上(6,1)的小猫,而位置速度为(1,2)的小猫则会和(1,1)一起,所以最多三只小猫一组。
Analysis:
总体思路是将小猫进行排序后输出最大一组的小猫个数。一直卡住的地方是,觉得要后面的比前面的一个大才行,但应该是前面中最小的那个。比如说以下测试数据,这样只有一组:
4
1 4
2 2
3 3
4 1
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
typedef pair<int,int> PII;
PII a[maxn];//记录每一个位置小猫的初始信息
PII val[maxn];//存储每一个位置的个数、速度
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].first,&a[i].second);
}
sort(a,a+n);
// for(int i=0;i<n;i++){
// cout<<a[i].first<<" "<<a[i].second<<endl;
// }
int pos = 0;
//先对初始位置确定每个位置点的速度情况
for(int i=0;i<n;i++){//遍历每一个位置
val[pos].first = 1;//记录个数
val[pos].second = a[i].second;//记录速度,按最小速度
for(int j=i+1;j<n;j++){//记录这个位置一共有多少只小猫
if(a[i].first==a[j].first){
val[pos].first++;
i++;
}else{
break;
}
}
pos++;
}
//打印val
// for(int i=0;i<pos;i++){
// cout<<val[i].first<<" "<<val[i].second<<endl;
// }
int res = 0;
for(int i=pos-1;i>=0;i--){
int cnt = val[i].first;//记录这个区间段有多少只小猫
int v = val[i].second;
while(1){
if(v<val[i-1].second && i-1>=0){
cnt+=val[i-1].first;
i--;
}else{
res = max(res,cnt);
break;
}
}
}
cout<<res;
return 0;
}