# APCS實作題2025年11月高級第2題:列印工廠 > 第1版:2025年11月18日 > 第2版:2025年11月24日,更正標題,這題是 APCS **高級**實作題,不是中高級,我之前弄錯了。 > 作者:王一哲 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=r627) <br /> ## 解題想法 這題的測資不大,先産生所有工作的排序方式,再用二分搜尋法對每一種工作排序方式找出最長的休息時間。如果要産生所有的排序方式,在 Python 可以用 itertools.permutations; 在 C++ 可以先排序,再用 algorithm 函式庫的 next_permutation 産生下一種排序方式。 <br /><br /> ## Python 程式碼 使用時間約為 0.8 s,記憶體約為 3.1 MB,通過測試。 ```python= from itertools import permutations n = int(input()) # n 項工作 tasks = [list(map(int, input().split())) for _ in range(n)] # 工作開始、截止、執行時間 ans = 0 # 答案 for perm in permutations(tasks): # 枚舉所有工作排序方式 low, high = 0, 1000 # 下限、上限 while low <= high: # 對答案二分搜 mid = (high + low) // 2 last = 0 # 最早開始時間 flag = True # 休息時間為 mid 是否可以完成所有的工作 for i in range(n): # 依序檢查每項工作 s, d, t = perm[i] # 第 i 項工作開始、截止、執行時間 if i > 0: last += mid # 不是首項工作,last 加上 mid last = max(last, s) # 如果工作開始時間更晚,last 改為 s if last + t > d: # 無法在截止時間之前完成工作 flag = False break last += t # 更新 last if flag: # 如果休息時間為 mid 可以完成所有工作 ans = max(ans, mid) # 更新 ans low = mid + 1 # 提高 low,用更長的休息時間再測試 else: # 無法完成所有工作 high = mid - 1 # 降低 high,用更短的休息時間再測試 """ 測試完所有的工作排序方式,印出答案 """ print(ans) ``` <br /><br /> ## C++ 程式碼 使用時間約為 7 ms,記憶體約為 312 kB,通過測試。 ```cpp= #include <cstdio> #include <vector> #include <algorithm> using namespace std; int main() { int n; scanf("%d", &n); // n 項工作 vector<vector<int>> tasks (n, vector<int> (3, 0)); // (開始, 結束, 所需時間) for(int i=0; i<n; i++) { scanf("%d %d %d", &tasks[i][0], &tasks[i][1], &tasks[i][2]); } sort(tasks.begin(), tasks.end()); // 排序 int ans = 0; // 答案 do { int low = 0, high = 1000; // 下限、上限 while(low <= high) { // 對答案二分搜 int mid = (high - low) / 2 + low; // 中間值 int last = 0; // 最近一次工作的開始時間 bool flag = true; // 是否能完成所有的工作 for(int i=0; i<n; i++) { // 依序檢查所有的工作 int s = tasks[i][0], d = tasks[i][1], t = tasks[i][2]; if (i > 0) last += mid; // 不是首項工作,加上休息時間 last = max(last, s); // 時間要取 last 及 s 較大者 if (last + t > d) { // 無法在截止時間前完成 flag = false; break; } last += t; } if (flag) { // 休息時間為 mid 可以完成所有的工作 low = mid + 1; // 提高 low ans = max(ans, mid); // 更新 ans } else { // 反之,降低 high high = mid - 1; } } } while(next_permutation(tasks.begin(), tasks.end())); // 改變排序 printf("%d\n", ans); return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`C++`、`Python`