# TOIP 202412程式碼 ## P1 旅遊計畫 (Travel) ### 分析 **功能:** 該程式在兩個數列 `ptr` 和 `ptrr` 中找到一對數字,使得總成本公式最小,並輸出結果。 公式: total = ptr[i] + ptrr[j] + 1000 * abs(i - j) **步驟:** 1. **輸入數據:** - 讀取兩個固定大小為 10 的數列 `ptr` 和 `ptrr`。 2. **變數初始化:** - `total = INT_MAX`:存儲當前最小總成本。 - `ii, jj`:存儲最小總成本對應的索引(1-based)。 3. **計算總成本:** - 雙重迴圈遍歷所有可能的 \( (i, j) \) 配對。 - 計算公式: \[ \text{total} = \text{ptr}[i] + \text{ptrr}[j] + 1000 \times |i - j| \] - 如果當前總成本小於 `total`,更新 `total` 和索引 \( ii, jj \)。 4. **輸出結果:** - 輸出最小總成本對應的索引 \( ii, jj \) 和 `total`。 ### 程式碼 ```cpp= #include <bits/stdc++.h> using namespace std; //JAckis666 int main(){ int n=10; int ptr[10]; int ptrr[10]; int dp[10]; for(int i=0;i<10;i++){ cin>>ptr[i]; } for(int i=0;i<10;i++){ cin>>ptrr[i]; } int ii,jj,total=INT_MAX; for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ if(ptr[i]+ptrr[j]+1000*abs(i-j)<total){ total=ptr[i]+ptrr[j]+1000*abs(i-j); ii=i+1; jj=j+1; } } } cout<<ii<<" "<<jj<<" "<<total; } ``` ## P2香料 (Spices) ### 分析 1. **結構定義與變數初始化** ```cpp struct findddd{ int a=0, b=0; }; ``` - 定義結構 `findddd`,儲存香料所在的層數 (`a`) 和位置 (`b`)。 - 預設屬性 `a` 和 `b` 為 `0`,表示香料尚未找到。 ```cpp int n; cin >> n; int f[10001]; ``` - 讀入要查找的香料數量 `n`。 - 陣列 `f` 儲存要查找的香料編號。 2. **輸入目標香料編號** ```cpp for (int i = 0; i < n; i++) { cin >> f[i]; } ``` - 使用迴圈讀入香料編號並存入 `f` 陣列。 3. **初始化貨架資訊** ```cpp findddd pur[20001]; int aa, bb; cin >> aa >> bb; ``` - `pur[20001]`:大小為 20001 的陣列,儲存每個香料的層數與位置。 - 讀入 `aa` 和 `bb`,分別表示貨架層數和每層的香料數量。 4. **貨架資料存入結構** ```cpp for (int i = 0; i < aa; i++) { for (int j = 0; j < bb; j++) { int buy; cin >> buy; pur[buy].a = i + 1; pur[buy].b = j + 1; } } ``` - 雙重迴圈遍歷貨架,讀入每個香料編號 `buy`。 - 根據所在層數與位置更新 `pur[buy]` 的 `a` 和 `b`。 5. **查詢香料位置** ```cpp for (int i = 0; i < n; i++) { if (pur[f[i]].a != 0) cout << pur[f[i]].a << " " << pur[f[i]].b << endl; else cout << "-1" << endl; } ``` - 遍歷目標香料列表 `f`。 - 若 `pur[f[i]].a` 不為 `0`,則輸出其層數與位置。 - 若為 `0`,則表示香料不存在,輸出 `-1`。 --- ### 程式重點 1. 使用結構儲存每個香料的位置信息,有效解決貨架數據的查詢需求。 2. 使用香料編號作為索引,快速找到對應位置,減少查詢時間。 --- ### 時間複雜度 1. **讀取貨架資料:** O(R*C)。 2. **查詢香料位置:** O(n)。 - 查詢每個香料時直接訪問索引,為 O(1)。 3. **總時間複雜度:** O(R*C)。 ```cpp= #include <bits/stdc++.h> using namespace std; struct findddd{ int a=0,b=0; }; int main(){ int n; cin>>n; int f[10001]; for(int i=0;i<n;i++){ cin>>f[i]; } findddd pur[20001]; int aa,bb; cin>>aa>>bb; for(int i=0;i<aa;i++){ for(int j=0;j<bb;j++){ int buy; cin>>buy; pur[buy].a=i+1; pur[buy].b=j+1; } } for(int i=0;i<n;i++){ if(pur[f[i]].a!=0) cout<<pur[f[i]].a<<" "<<pur[f[i]].b<<endl; else{ cout<<"-1"<<endl; } } } ``` ## P3 p902. 凱撒密碼 (Cipher) ```cpp= #include <bits/stdc++.h> using namespace std; int main() { string input; getline(cin, input); int shift; cin >> shift; shift %= 26; for (char &ch : input) { if (isupper(ch)) { ch = 'A' + (ch - 'A' + shift) % 26; } else if (islower(ch)) { ch = 'a' + (ch - 'a' + shift) % 26; } } cout << input << endl; } Jackis666 ``` 只後有空用chatgpt生題解