#55334: c++


yp11451267@yphs.tp.edu.tw (705-43鄭丞博)


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定義一個極大值代表無限大,防止溢位使用長整數
const long long INF = 1e18;

void solve() {
    int n;
    while (cin >> n && n != 0) {
        vector<long long> a(n + 1, 0);
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }

        // dp[i] 表示停在第 i 個休息站的最小懲罰總和
        vector<long long> dp(n + 1, INF);
        // parent[i] 用來記錄第 i 個休息站是從哪一個休息站過來的
        vector<int> parent(n + 1, -1);

        // 起點(第 0 個站)的懲罰值為 0
        dp[0] = 0;

        // 動態規劃轉移
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j < i; ++j) {
                long long miles = a[i] - a[j];
                long long penalty = (200 - miles) * (200 - miles);
                
                if (dp[j] + penalty < dp[i]) {
                    dp[i] = dp[j] + penalty;
                    parent[i] = j;
                }
            }
        }

        // 從終點 n 開始回溯找到完整路徑
        vector<int> path;
        int curr = n;
        while (curr != -1) {
            path.push_back(curr);
            curr = parent[curr];
        }

        // 因為回溯是由後往前,我們需要反轉回正確的順序
        reverse(path.begin(), path.end());

        // 輸出結果
        for (size_t i = 0; i < path.size(); ++i) {
            cout << path[i] << (i + 1 == path.size() ? "" : " ");
        }
        cout << "\n";
    }
}

int main() {
    // 優化標準輸入輸出流
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    solve();
    
    return 0;
}