一根長度為 L 厘米的木棒上有 N 隻螞蟻,每隻螞蟻以 1 厘米/秒的速度向左或向右行走。當兩隻螞蟻相撞時,它們同時掉頭(掉頭時間忽略不計)。已知每隻螞蟻距離木棒左端的距離,求多少秒後所有螞蟻剛好都從木棒上掉下來。
約束條件:N, L ≤ 1000。
N 和 LN 行:每行一個字符(L 或 R)表示方向,和一個整數 x 表示距離左端距離輸入: 4 10 R 1 R 5 L 3 R 9 輸出: 9
關鍵觀察:兩隻螞蟻相撞後掉頭,與它們直接穿過彼此繼續前進,對「最後一隻螞蟻掉落的時間」完全等價。
原因:螞蟻不可區分,碰撞交換身份後繼續移動,等同於兩隻螞蟻保持原方向穿過對方。因此,每隻螞蟻的掉落時間僅取決於其初始位置和朝向,與碰撞無關。
L)的螞蟻:掉落時間 = 距離左端距離 xR)的螞蟻:掉落時間 = L - x#include <stdio.h>
int main() {
int N, L;
scanf("%d %d", &N, &L);
int maxTime = 0;
for (int i = 0; i < N; i++) {
char dir;
int x;
scanf(" %c %d", &dir, &x); // 注意 %c 前的空格跳過換行符
int time = (dir == 'R') ? (L - x) : x;
if (time > maxTime) maxTime = time;
}
printf("%d\n", maxTime);
return 0;
}
O(N),單次遍歷O(1),僅需常數額外空間若螞蟻有大小、速度不同、或木棒有彈性邊界,問題將如何變化?這些變體考察的是建模能力與邊界條件處理。