牛客周賽 Round 63

Iter-moon發表於2024-10-14

A.小紅的好數

題意:

滿足數位為2, 且個位數和十位數相等

思路:

透過輸入字串, 首先判斷字串的個數是否為2, 在判斷個位數和十位數是否相等

複雜度:

O(1)

Code:

#include <bits/stdc++.h>
    
using namespace std;
using i64 = int64_t;  

void solve() {
    string s;
    cin >> s;
    if (s[0] == s[1] && s.size() == 2) {
        cout << "Yes\n";
    } else {
        cout << "No\n";
    }
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

B.小紅的好陣列

題意:

找到區間為k長度的連續區間且不是迴文陣列但是可以修改一次得到迴文陣列, 計算當前滿足迴文陣列條件的個數

思路:

直接暴力列舉長度為k的連續區間, 判斷是否修改一次滿足是迴文陣列

複雜度:

O(n * k)

Code:

#include <bits/stdc++.h>
 
using namespace std;
using i64 = int64_t;
    
void solve() {
    int n, k;
    cin >> n >> k;
    vector <int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    int ans = 0;
    for (int i = 0; i <= n - k; i++) {
        vector <int> b(a.begin() + i, a.begin() + i + k);
        int cnt = 0; 
        for (int l = 0, r = k - 1; l < r; l ++, r --) {
            if (b[l] != b[r]) {
                cnt++;
                if (cnt > 1) { 
                    break;
                }
            } 
        }
        if (cnt == 1) {
            ans++;
        }
    }
    cout << ans << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C.小紅的矩陣行走

題意:

從(0, 0)出發, 只能走下或右且每走一步都收集數字, 走到(n - 1, m - 1)且所有收集的數字都是相同的

思路:

一道基礎的板子題, 寫法很多

Code:

#include <bits/stdc++.h>
    
using namespace std;
using i64 = int64_t; 
constexpr int N = 1e2 + 5;
int dirs[3] = {1, 0, 1}, n, m, a[N][N];
bool ok = 1;

bool check (int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < m;
}

void dfs (int x, int y) {
    if (x == n - 1 && y == m - 1) {
        ok = 0;
        return ;
    }
    for (int i = 0; i < 2; i++) {
        int dx = dirs[i] + x, dy = dirs[i + 1] + y;
        if (check(dx, dy) && a[dx][dy] == a[0][0]) { 
            dfs(dx, dy);
        }
    }
}

void solve() { 
    cin >> n >> m; 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    } 
    ok = 1;
    dfs(0, 0);
    cout << (!ok? "Yes" : "No") << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

#include <bits/stdc++.h>
    
using namespace std;
using i64 = int64_t; 
constexpr int N = 1e2 + 5;
int dirs[3] = {1, 0, 1}, a[N][N], n, m;

bool check (int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < n;
}

void solve() { 
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    queue <pair<int, int>> q;
    q.push({0, 0});
    while (!q.empty()) {
        auto [x, y] = q.front(); q.pop();
        if (x == n - 1 && y == m - 1) {
            cout << "Yes" << '\n';
            return ;
        }
        for (int i = 0; i < 2; i++) {
            int dx = dirs[i] + x, dy = dirs[i + 1] + y;
            if (check(dx, dy) && a[dx][dy] == a[0][0]) {
                q.push({dx, dy});
            }
        }
    }
    cout << "No" << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

#include <bits/stdc++.h>
    
using namespace std;
using i64 = int64_t;
constexpr int N = 1e2 + 5; 
int n, m, dp[N][N], a[N][N];

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
            dp[i][j] = 0;
        }
    }
    dp[1][1] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (i == 1 && j == 1) continue;
            if (a[i][j] != a[1][1]) continue; 
            dp[i][j] = (i > 1 ? dp[i - 1][j] : 0) || (j > 1 ? dp[i][j - 1] : 0);
        }
    }
    cout << (dp[n][m] ? "Yes" : "No") << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

  

D:小紅的行列式構造

題意:

構造一個3階行列式, 滿足每個元素的絕對值不小於1, 且最後的值等於x

思路:

[a, b, c]
[d, e, f]
[g, h, i]

-> a * e * i + b * f * g + c * d * h - a * f * h - b * d * i - c * e * g
-> a * (e * i - f * h) + b * (f * g - d * i) + c * (d * h - e * g)

假設 a, b, c都是相同的, 那麼我們令它們為1
-> 1 * (e * i - f * h) + 1 * (f * g - d * i) + 1 * (d * h - e * g)
-> d * (h - i) + e * (g - i) + f * (g - h)

如果假設d, e, f都是相同導致最終的結果為0, 也就是得到一個結論
如果a, b, c相同且d, e, f相同最終結果一定為0

那麼我們只能在d, e, f挑不是相同, 那麼e, f 為1, d為2, 透過計算式子可以得到
-> 2 * (h - i) + 1 * (g - i) + 1 * (g - h)
-> 2 * (h - i) + g - i - g + h - i
-> 2 * (h - i) + 0
h - i = x 那麼只要滿足這個式子都可以, 那麼我可以假設i = 101那麼我的h就是x + 101
為什麼不能是x + (值 < 101) 是因為行列式的值的絕對值需要大於等於x也就因為這, 最小情況只能是[g, x + 101 x]
其次發現g在這個式子是直接被約掉的, 那麼abs(g) >= 1的值都可以 
那麼這題就順利解決了

  

Code:

#include <bits/stdc++.h>
    
using namespace std;
using i64 = int64_t;  

void solve() {
    int x;
    cin >> x;
    if (x == 0) {
        cout << "1 1 1\n1 1 1\n1 1 1\n";
    } else {
        cout << "1 1 1\n2 1 1\n" << 2 << ' ' << x * 2 << ' ' << x << '\n';
    }
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

  2