n 個錢包排成一排,第 i 個需要放入 a[i] 個硬幣。機器人初始站在最左邊(位置 1),每秒可執行三種操作之一:
L:向左移動一格(若不在最左端)R:向右移動一格(若不在最右端)P:在當前位置放入一枚硬幣限制:不能連續執行兩次 P 操作。總操作數不超過 10^6。輸出任意合法操作序列。
由於不能連續 P,當某位置需要放入多枚硬幣(a[i] > 1)時,必須在兩次 P 之間插入移動操作。最簡策略:
RL 或 LR 往返(如 PRLP)n):只能用 LR(先左後右)RL(先右後左)i = 1..ni,放入 a[i] 枚硬幣:
Pa[i] 枚:根據邊界情況插入 RL 或 LR 再 PR 移動到下一個位置#include <iostream>
#include <cstdio>
using namespace std;
int a[305];
int main() {
int n;
while (cin >> n) {
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) {
int placed = 0; // 當前位置已放入硬幣數
while (a[i] > 0) {
if (placed > 0) {
// 第2枚及以後,需要插入移動避免連續P
if (i == n - 1) cout << "LR"; // 最右端:先左後右
else cout << "RL"; // 其他:先右後左
}
cout << "P";
a[i]--;
placed++;
}
if (i < n - 1) cout << "R"; // 移動到下一個位置
}
cout << endl;
}
return 0;
}
輸入:2\n1 2
輸出:PRPLRP
P(放1枚)→ R(移到位置2)P(第1枚)→ LR(往返)→ P(第2枚)輸入:4\n0 2 0 2
輸出:RPRRPLLPLRRRP
O(n + Σa[i]),每個硬幣常數次操作Σa[i] * 3 + n ≤ 300 * 300 * 3 + 300 = 270,300 < 10^6,滿足限制LR、最左端用 RL 保證不越界P:每兩個 P 間至少插入 2 個移動指令