11/17 期中考

連結

https://hackmd.io/@sa072686/SJyPwnZ4p

題目(共四題)

  • PA

    題意 :

    兩個陣列長度為

    n
    求操作
    K
    次能讓兩個陣列相等
    每次只能動陣列一個數字
    ±1

    解題思路 :

    先計算整體陣列需要的移動次數
    然後再計算 K-移動次數 是否是偶數

    程式碼 :
    ​​​​#include <iostream> ​​​​#include <vector> ​​​​using namespace std; ​​​​int main() { ​​​​ long long n, k; ​​​​ cin >> n >> k; ​​​​ vector<long long> lista(n); ​​​​ vector<long long> listb(n); ​​​​ for(int i = 0; i <n; i++) { ​​​​ cin >> lista[i]; ​​​​ } ​​​​ for(int i = 0; i <n; i++) { ​​​​ cin >> listb[i]; ​​​​ } ​​​​ long long sum = 0; ​​​​ for(int i = 0; i<n; i++) { ​​​​ sum += abs(lista[i]-listb[i]); ​​​​ } ​​​​ if((k-sum)%2==0 && !(k-sum <0)) { ​​​​ cout << "Yes\n"; ​​​​ } ​​​​ else cout << "No\n"; ​​​​ return 0; ​​​​}

    解題心得 :

    這題卡最久
    因為我那時候直接用K-sum
    沒有負數判斷就錯了
    (就因為這題沒拿到第一…

  • PB :

    題意 :

    n 個數字 然後
    s
    次操作
    最後要選到
    p

    解題思路 :

    檢測那行有沒有

    p 就行

    程式碼
    ​​​​#include <iostream> ​​​​using namespace std; ​​​​int main() { ​​​​ int n, p, s; cin >> n >> p >> s; ​​​​ for(int k = 0; k < s; k++) { ​​​​ int m; cin >> m; ​​​​ bool ok = false; ​​​​ for(int i = 0; i < m; i++) { ​​​​ int a; cin >> a; ​​​​ if(a==p) { ​​​​ ok = true; ​​​​ } ​​​​ } ​​​​ cout << (ok ? "KEEP\n" : "REMOVE\n"); ​​​​ } ​​​​ return 0; ​​​​}

    解題心得 :

    看題目看很久
    但是做起來很快

  • PC :

    題意 :

    A 秒到
    B
    秒一個線段
    C
    D
    也是一個線段
    求疊合

    解題思路 :

    令a<c, b>d
    求d-c就行

    程式碼
    ​​​​#include <iostream> ​​​​using namespace std; ​​​​int main() { ​​​​ int a, b, c, d; ​​​​ cin >> a >> b >> c >> d; ​​​​ if(a>c) {swap(a, c);} ​​​​ if(b<d) {swap(b, d);} ​​​​ cout << (d-c <0 ? 0 : d-c) << endl; ​​​​ return 0; ​​​​}

    解題心得 :

    一開始還打算用很多個if else 下去判斷
    但是想想又覺得用排序就行
    但是到最後才想出來數線解法哈哈
    最後發現(其實用maxmin就行;:

  • PD :

    題意 :

    N長度的陣列
    然後[index]= P
    求一個陣列Q[P]之值

    解題思路 :

    map直接紀錄P跟index
    然後轉換方式輸出就行

    程式碼
    ​​​​#include <iostream> ​​​​#include <vector> ​​​​#include <map> ​​​​using namespace std; ​​​​int main() { ​​​​ int n; cin >> n; ​​​​ map<int, int> list; ​​​​ for(int i =1; i<=n; i++) { ​​​​ int a; cin >> a; ​​​​ list[a] = i; ​​​​ } ​​​​ for(const auto &d : list) { ​​​​ cout << d.second << ' '; ​​​​ } ​​​​ cout << endl; ​​​​ return 0; ​​​​}

    解題心得 :

    那時候被第一題干擾心態(藉口
    所以沒有第一時間就想到map的解@@

賽後心得

這次算是比較難一點的題目了
但最主要難過的還是我每次都錯在小地方@@

附上照片 :

螢幕擷取畫面 2024-01-05 213139