P3111 [USACO14DEC] Cow Jog S 题解
洛谷的翻译不太好。补一下。
题目描述
奶牛们又出来锻炼蹄子啦!现在有 \(N\) 头奶牛在一条无限长的单车道跑道上慢跑(\(1 \leq N \leq 10^5\))。每头奶牛开始时都处于跑道上的不同位置,并且有些奶牛以不同的速度慢跑。由于跑道只有一条车道,奶牛之间无法超越。当一头速度较快的奶牛追上另一头奶牛时,它必须减速以避免撞到其他奶牛,从而成为同一跑步组的一部分。奶牛们将跑 \(T\) 分钟(\(1 \leq T \leq 10^9\))。请帮 Farmer John 确定到那时会剩下多少个跑步组。如果两头奶牛在 \(T\) 分钟结束时处于相同位置,则应将它们视为同一组。
输入、输出
输入的第一行包含两个整数 \(N\) 和 \(T\)。接下来的 \(N\) 行每行包含一头奶牛的初始位置和速度。位置是非负整数,速度是正整数;两个数字都不超过 \(10^9\)。所有奶牛的起始位置都不同,并且这些位置将在输入中按递增顺序给出。
一个整数,表示在 \(T\) 分钟后剩余多少组。
解析
先算出所有奶牛的最终位置。如果一个奶牛超过了上一个奶牛,那么它们两个一定为一组。(因为位置将在输入中按递增顺序给出,即两个比较的奶牛之间没有另外的奶牛。)如果没有,我们算剩下的牛为第二组,然后再在第二组中进行新的比较。最后输出。
#include <iostream>
using namespace std;
long long N, T, e[100005], ans=1;
int main(void){
cin >> N >> T;
for(int i=1, p, v; i<=N; ++i)
cin >> p >> v, e[i] = p+T*v; // 算出最终位置
for(int i=N-1; i>0; --i)
if(e[i] >= e[i+1]) e[i] = e[i+1]; // 一个奶牛超过了上一个奶牛
else ++ans;
cout << ans;
return 0;
}
posted on 2025-10-14 22:05 符星珞-Astralyn 阅读(2) 评论(0) 收藏 举报