AtCoder Beginner Contest 378

_SeiI發表於2024-11-02


A - Pairing

題意

\(4\)個數,每次選兩個數字相同的丟掉。求最大運算元。

思路

模擬。

程式碼

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

void solve()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    map<int, int> m;
    m[a]++;
    m[d]++;
    m[c]++;
    m[b]++;
    int ans = 0;
    for (auto& i : m)
    {
        ans += i.second / 2;
    }
    cout << ans << endl;

}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}


B - Garbage Collection

題意

\(n\)種垃圾,對於第\(i\)種垃圾,當日期對\(q_i\)取模等於\(r_i\)時,這種垃圾會被回收。有\(Q\)次查詢,對於第\(j\)次查詢,給定垃圾型別\(t_j\)和投放日期\(d_j\),輸出這種垃圾下一次被回收的日期。
注:如果垃圾的投放日期和收集日期相同,則垃圾會在當天被回收。

思路

模擬。

程式碼

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

void solve()
{
    int n;
    cin >> n;
    vector<int> q(n), r(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> q[i] >> r[i];
    }
    int Q;
    cin >> Q;
    while (Q--)
    {
        int t, d;
        cin >> t >> d;
        t--;
        int qi = q[t], ri = r[t];
        int now = d % qi, ans;
        if (now == ri)
        {
            ans = d;
        }
        else if (now < ri)
        {
            ans = d + ri - now;
        }
        else
        {
            ans = d + qi - now + ri;
        }
        cout << ans << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

C - Repeating

題意

給定長度為\(n\)的正整數序列\(A\ =\ (A_1,A_2,···,A_n)\)。定義序列\(B\ =\ (B_1,B_2,···,B_n)\),對於\(i\ =\ 1,2,···,n\),若存在\(j\ (j < i)\)使得$$A_i=A_j\(則\)B_i = j\(,否則\)B_i = -1$。

思路

模擬,怕超時用了個\(set\)記錄下標到\(i\)時出現過的元素。

程式碼

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

void solve()
{
    int n;
    cin >> n;
    vector<int> v(n), b(n, -1);
    for (int i = 0; i < n; i++)
    {
        cin >> v[i];
    }
    set<int> s;
    for (int i = 0; i < n; i++)
    {
        if (s.count(v[i]))
        {
            for (int j = i - 1; j >= 0; j--)
            {
                if (v[j] == v[i])
                {
                    b[i] = j + 1;
                    break;
                }
            }
        }
        s.insert(v[i]);
    }
    for (int i = 0; i < n; i++)
    {
        cout << b[i] << " ";
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

D - Count Simple Paths

題意

給定\(h\)行、\(w\)列的圖,"."表示空,"#"表示阻塞。求從每個點出發,不被阻塞的、長度為\(k+1\)的路徑條數(不能重複經過一點)。

思路

資料非常小,直接搜。

程式碼

點選檢視程式碼
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 15;

char mp[mxn][mxn];
bool vis[mxn][mxn];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
int h, w, k;
int ans;

void dfs(int x, int y, int step)
{
    if (step == k) 
    {
        ans++;
        return;
    }
    for (int i = 0; i < 4; i++) 
    {
        int tx = x + dx[i];
        int ty = y + dy[i];
        if (tx < 0 || tx >= h || ty < 0 || ty >= w || vis[tx][ty] || mp[tx][ty] == '#')
        {
            continue;
        }
        vis[tx][ty] = true;
        dfs(tx, ty, step + 1);
        vis[tx][ty] = false;
    }
}

void solve() 
{
    cin >> h >> w >> k;
    for (int i = 0; i < h; i++) 
    {
        for (int j = 0; j < w; j++) 
        {
            cin >> mp[i][j];
        }
    }

    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++) 
        {
            if (mp[i][j] == '.') 
            {
                vis[i][j] = true; 
                dfs(i, j, 0);
                vis[i][j] = false; 
            }
        }
    }
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

E - Mod Sigma Problem

題意

給定\(n\)\(m\),求:

思路

程式碼

點選檢視程式碼



比賽連結 <>