電梯初始在第 0 層,上一層 6 秒,下一層 4 秒,開門 5 秒(有人下才開),每人下電梯 1 秒。已知乘客目標樓層,電梯必須最終回到 0 層。求總耗時。
C ≤ 100, N ≤ 15, 樓層 ≤ 100。
電梯必須到達 最高目標樓層 Max,中途有乘客的樓層必停、無乘客不停。
總時間 = 上行 + 下行 + 停靠開關門 + 乘客下梯。
Max * 6Max * 4Max * 10cnt[floor],記錄最高層 Maxans = Max * 10cnt[i] > 0 則 ans += 5 + cnt[i]ans#include <stdio.h>
#include <string.h>
int main() {
int C;
scanf("%d", &C);
while (C--) {
int N;
scanf("%d", &N);
int cnt[101] = {0};
int Max = 0;
for (int i = 0; i < N; i++) {
int floor;
scanf("%d", &floor);
cnt[floor]++;
if (floor > Max) Max = floor;
}
int ans = Max * 10; // 上去下來基礎時間
for (int i = 1; i <= Max; i++) {
if (cnt[i] > 0)
ans += 5 + cnt[i]; // 開門 5s + 每人 1s
}
printf("%d\n", ans);
}
return 0;
}
輸入:
2
4 2 4 3 2
3 10 10 10
Case 1: 樓層 2(2人), 3(1人), 4(1人), Max=4
基礎 = 4*10 = 40
停靠: 2樓 5+2=7, 3樓 5+1=6, 4樓 5+1=6 → 總計 19
答案 = 40+19 = 59 ✓
Case 2: 10樓 3人, Max=10
基礎 = 10*10 = 100
停靠: 10樓 5+3=8
答案 = 108 ✓
| 誤區 | 正確理解 |
|---|---|
| 以為電梯會多次上下 | 題目隱含「單趟任務」:從 0 直上最高層再直降回 0 |
| 0 樓也要開門 | 題目說「最後必須再回到 0 層才算結束」,0 樓不開門、不計時間 |
| 同層多人開門時間疊加 | 開門 5 秒/層,無論多少人;下梯 1 秒/人 |
| 樓層未排序需排序 | 統計數組下標即樓層,天然有序,無需排序 |
本題看似模擬,實為 「最高層決定行程骨架,中間層獨立貢獻停靠時間」 的數學結構。關鍵在於識別「電梯必須到達最高層且不回頭」這一約束,將問題簡化為統計計數。這類「模擬題找規律化歸數學」是 ACM 入門必練思維。