請不要直接抄寫程式碼! 也請不要直接跳到程式碼部分,除非你已經寫好了,想要參考別人的寫法!

第二題

  • 此次解題用到 STL 中的 set , 需要引入 <set> 這個函式庫
  • set 意思是 集合 , C++ 中的 set 跟數學上的 集合 很像
    • set 中不會有重複的元素
    • 但是 set 會自動由小到大排序
  • STL 中有一個 find 函式,意思就是尋找該容器中是否存在這個數值,回傳值為 iterator
  • 其他就是單純邏輯運算
  • 查詢 <algorithm> 函式庫,會有意想不到的答案

※ 雖然 set 很好用,但是對於 C++ 初學者較難理解,所以先用 array 實作 set 看看喔!

程式碼大概如下:

#include <iostream>
#include <set>
using namespace std;

void printAnd(set<int> a, set<int> b);
void printOr(set<int> a, set<int> b);
void printNot(set<int> a, set<int> b);
void printXor(set<int> a, set<int> b);
void printSet(set<int> a);

int main()
{
    set<int> setA;
    set<int> setB;

    int a,b;
    cin>>a>>b;

    for (int i=0;i<a;i++) {
        int temp;
        cin>>temp;
        setA.insert(temp);
    }
    for (int i=0;i<b;i++) {
        int temp;
        cin>>temp;
        setB.insert(temp);
    }

    char symbol;
    while (cin>>symbol) {
        switch (symbol) {
            case 'A':
            case 'a':
                printAnd(setA,setB);
                break;
            case 'O':
            case 'o':
                printOr(setA,setB);
                break;
            case 'N':
            case 'n':
                printNot(setA,setB);
                break;
            case 'X':
            case 'x':
                printXor(setA,setB);
                break;
            default:
                break;
        }
    }
}

void printAnd(set<int> a, set<int> b) {
    set<int> result;
    set<int>::iterator it,temp;
    for (it=b.begin();it!=b.end();it++) {
        temp = a.find(*it);
        if (temp!=a.end())
            result.insert(*temp);
    }

    printSet(result);
}

void printOr(set<int> a, set<int> b) {
    set<int>::iterator it;
    for (it=b.begin();it!=b.end();it++) {
        a.insert(*it);
    }

    printSet(a);
}

void printNot(set<int> a, set<int> b) {
    set<int>::iterator it;
    for (it=b.begin();it!=b.end();it++) {
        a.erase(*it);
    }

    printSet(a);
}

void printXor(set<int> a, set<int> b) {
    set<int> temp;
    set<int>::iterator it,itTemp;
    // and
    for (it=b.begin();it!=b.end();it++) {
        itTemp = a.find(*it);
        if (itTemp!=a.end())
            temp.insert(*itTemp);
    }
    // or
    for (it=b.begin();it!=b.end();it++) {
        a.insert(*it);
    }
    for (it=temp.begin();it!=temp.end();it++) {
        a.erase(*it);
    }

    printSet(a);
}

void printSet(set<int> a) {
    set<int>::iterator it;
    for (it=a.begin();it!=a.end();it++) {
        if (it==a.begin())
            cout<<*it;
        else
            cout<<" "<<*it;
    }
    cout<<endl;
}

第三題

  • 這題可以上網查查看 最大連續整數和 ,有相關的演算法
  • 但不用害怕!我們來簡單化!
  • 因為要最大和,所以 負數 不加
-2 5 1 4 -3 1 -10  // 原陣列
-2 5 6 10 -3 1 -10 // 整數和陣列
  • 先將 index 指向 1
  • 判斷前面一位是否為 正數 ,是就把當前的數值加前一位數值
  • 最後判斷是否為當前最大值,就結束一 round
  • 小提示:上方的 6 = 5 + 110 = 6 + 4 = 5 + 1 + 4
  • 題目還有一個要求,全都負數就輸出 0 ,這部分比較簡單,就交給你想囉!

程式碼大概如下:

#include <iostream>
using namespace std;
int main()
{
    int times;
    int arr[5000];
    cin>>times;
    while (times--) {
        int n;
        cin>>n;
        for (int i=0;i<n;i++)
            cin>>arr[i];

        bool isNegative = true;
        for (int i=0;i<n;i++) {
            if (arr[i]>0) {
                isNegative = false;
                break;
            }
        }

        int maximum = -1001;
        for (int i=1;i<n;i++) {
            if (arr[i-1]>0)
                arr[i] += arr[i-1];
            if (arr[i] > maximum)
                maximum = arr[i];
        }

        if (isNegative)
            cout<<"0"<<endl;
        else
            cout<<maximum<<endl;

    }
}

如果有任何問題,歡迎私訊跟我討論喔!