APCS【2022年6月】題解整理

題解

作者內容連結
海牛觀念題HackMD
吳邦一C++
Python
P1 P2 P3 P4
P1 P2 P3 P4
謝一C++HackMD
橘子C++/PythonHackMD
KoyingC++HackMD
小律C++HackMD
阿祁JavaHackMD

ZeroJudge

P1:i399: 1. 數字遊戲
P2:i400: 2. 字串解碼
P3:i401: 3. 雷射測試
P4:i402: 4. 內積

P1:數字遊戲

輸入:3 個數字(1~9)。
輸出:出現同一數字的最多次數、不重複的數字(大到小)。
範例:輸入 1 1 3,最多次數:2,不重複的數字(大到小):3 1。

#include <iostream>
using namespace std;
int a[10];
int main(){
    int n, count=0;
    for(int i=0; i<3; i++){
        cin >> n;
        a[n]++;
        count = max(count, a[n]);
    }
    cout << count << ' ';
    for(int i=9; i>=1; i--)
        if(a[i] != 0)
            cout << i << ' ';
}

P2:字串解碼

輸入:m個長為n由0和1組成的字串e、長為n加密後的字母字串。
輸出:原本的字串。
加密流程:
(1) 如果字串e有奇數個1,假設是 ABCD,會變 CDAB。ABCDE 變 DECAB。
(2) 如果 e[i] 是 (1/0),就把原字串的 (尾/頭) 放到新字串。

解法:倒著做,(2)再(1)。我用 e[i][n] 計算共有幾個1,s2 當暫時的字串。

#include <iostream>
using namespace std;
int main(){
    int m, n;
    cin >> m >> n;
    int e[m][n+1];
    for(int i=0; i<m; i++){
        e[i][n] = 0;
        string input;
        cin >> input;
        for(int j=0; j<n; j++){
            e[i][j] = input[j]-'0';
            if(e[i][j] == 1) e[i][n]++;
        }
    }
    char s[n], s2[n];
    for(int i=0; i<n; i++) cin >> s[i];
    for(int i=m-1; i>=0; i--){
        int l=0, r=n-1;
        for(int j=0; j<n; j++){
            if(e[i][j] == 0) s2[l++] = s[j];
            else s2[r--] = s[j];
        }
        for(int j=0; j<n; j++) s[j] = s2[j];
        if(e[i][n]%2 != 0){
            if(n%2 == 0){
                for(int j=0; j<n/2; j++){
                    swap(s[j], s[j+(n/2)]);
                }
            }else{
                for(int j=0; j<(n-1)/2; j++){
                    swap(s[j], s[j+(n+1)/2]);
                }
            }
        }
    }
    for(int i=0; i<n; i++) cout << s[i];
}

P3:雷射測試

P4:內積

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *