【每日一题]2023百度之星-跑步 保姆级教程

今天是月末,来一道简单点的模拟的题

目录

题目:跑步

思路: 


【每日一题]2023百度之星-跑步 保姆级教程_第1张图片

题目:跑步

小度每天早上要和小猫一起跑步。小猫的位置数值越小表示越在后面,速度越小表示越慢,它们都向一个方向跑。

小猫比较喜欢一起跑,所以当速度更快的小猫遇见速度慢的小猫时,它就会放慢速度,变成一组一起跑。注意,初始位置相同的小猫直接组成一组。

请问最终不再有追赶上的情况时,最多一组有多少只小猫?

【每日一题]2023百度之星-跑步 保姆级教程_第2张图片

【每日一题]2023百度之星-跑步 保姆级教程_第3张图片

【每日一题]2023百度之星-跑步 保姆级教程_第4张图片

思路: 

我们先来捋一下题目哈:不同位置的小猫同时以不同速度开跑,当后面的猫追上前的猫时,它们就会以低速猫速度共速,成为一组,求最终一组最多的猫个数。

正着想不太好想,因为变化因素较多。我们可以倒着想:从最前面的猫开始推导,若i-1只猫速度大于第i只猫,不管i-1猫会不会被别的猫追上,都不会影响i-1猫追上i猫这个结果(你细品,因为i-1猫只要被追上,那么低速猫一定时i-1猫啊,对吧)。然后要注意一下刚开始在同一位置的猫会直接分成一组。
好了,那怎么操作呢。
我们先对猫按位置排列,同位置的猫猫速度小优先,然后先把同一位置的猫速度统一一下,此时同组的猫猫速度按最前面的猫速(最低速猫)设定速度,最后从后向前遍历:对i猫,将i后面连续所有v大于i的猫都直接统计出来(这个就是此组中最终会有的猫猫数),然后从i猫跳到不满足条件猫的位置(方便统计下一组的猫猫),不断重复即可!

当时走到了死胡同,没想到这个题这么简单,唉!我还得再练练

#include   //跑步:有n只小猫,出现在pi位置,速度为vi向前跑,不同速度小猫相遇时会共速成一组(取慢速那个),问最多一组的小猫个数
using namespace std;   //贪心,
const int N=1e5+10;
struct node{int p;int v;}ar[N];
bool cmp(node x,node y){
	if(x.p!=y.p)return x.p>n;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&ar[i].p,&ar[i].v);
	}
	sort(ar+1,ar+1+n,cmp);
	for(int i=1;i

你可能感兴趣的:(算法,c语言)