APCS考題解答 - 2017/10/18

PDF: https://apcs.csie.ntnu.edu.tw/files/1061028APCSImplementation.pdf

(1) c461: apcs 邏輯運算子 (Logic Operators)

解答


(2) c462: apcs 交錯字串 (Alternating Strings)

解答

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main()
{
    string s;
    int k;
    int upperLen,lowerLen;//連續大寫與小寫的長度
    int len;//目前的字串交錯長度
    int ansLen;//目前為止,確定的字串交錯長度,來自於len
    bool isPrevUpper;//前一次是否為大寫
    while(cin >> k){
        cin >> s;
        int length = s.length();
        upperLen = 0;
        lowerLen = 0;
        len = 0;
        ansLen = 0;
        if (isupper(s[0])) {
            isPrevUpper = true;//第一個是大寫
            upperLen++;//連續大寫字母遞增1
            if (upperLen == k){//達到k個長度
                len = k;//目前的字串交錯長度為k
                ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
            }
        }else{
            isPrevUpper = false;//第一個是小寫
            lowerLen++;//連續小寫字母遞增1
            if (lowerLen == k){//達到k個長度
                len = k;//目前的字串交錯長度為k
                ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
            }
        }
        for(int i=1;i<length;i++){//分析字串第2個到最後
            if (isupper(s[i]) && isPrevUpper) {//連續大寫
                upperLen++;    //upperLen遞增1
                lowerLen=0;
                if (upperLen == k){//達到k個長度
                    len += k;//目前的字串交錯長度遞增k
                    ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
                }
                if (upperLen > k){//超過k個
                    len = k;//目前的字串交錯長度為k
                }
            } else if (isupper(s[i]) && (!isPrevUpper)) {//之前是小寫,現在是大寫
                if (lowerLen<k){//連續小寫小於k個,且目前字元是大寫
                    len = 0;//目前的字串交錯長度為0
                }
                upperLen=1;
                lowerLen=0;
                if (upperLen == k){//達到k個長度
                    len += k;//目前的字串交錯長度遞增k
                    ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
                }
                isPrevUpper=true;//目前是大寫,供之後判斷
            } else if (islower(s[i]) && (!isPrevUpper)) {//連續小寫
                lowerLen++;    //lowerLen遞增1
                upperLen=0;
                if (lowerLen == k){//達到k個長度
                    len += k;//目前的字串交錯長度遞增k
                    ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
                }
                if (lowerLen > k){//超過k個
                    len = k;//目前的字串交錯長度為k
                }
            }else if (islower(s[i]) && (isPrevUpper)) {//之前是大寫,現在是小寫
                if (upperLen<k){//連續大寫小於k個,且目前字元是小寫
                    len = 0;//目前的字串交錯長度為0
                }
                lowerLen=1;
                upperLen=0;
                if (lowerLen == k){//達到k個長度
                    len += k;//目前的字串交錯長度遞增k
                    ansLen = max(ansLen,len);//len有更新,取ansLen與len大的到ansLen
                }
                isPrevUpper=false;//目前是小寫,供之後判斷
            }
        }
        cout << ansLen << endl;
    }
}

(3) c463: apcs 樹狀圖分析 (Tree Analyses)

解答

7     ← 一共有7個節點
0     ← 第1個節點下有0個子節點,帶表1是葉節點
2 6 7 ← 第2個節點下有2個子節點,2個子節點分別是6,7
2 1 4 ← 第3個節點下有2個子節點,2個子節點分別是1,4
0     ← 第4個節點下有0個子節點,帶表4是葉節點
2 3 2 ← 第5個節點下有2個子節點,2個子節點分別是3,2
0     ← 第6個節點下有0個子節點,帶表6是葉節點
0     ← 第7個節點下有0個子節點,帶表7是葉節點

這題的根節點是5,代表其他節點的父節點都不包含5


(4) c471: apcs 物品堆疊 (Stacking)

解答

results matching ""

    No results matching ""