제 11회 SCPC 1차 예선 후기

대회

푼 문제

1. 거스름돈 (100/100)

그리디, 시뮬레이션 문제. 시간에 따라 생기는 화폐의 개수를 관리한다. 화폐의 가치가 배수 관계이므로 항상 가치가 큰 화폐를 먼저 사용한다.

#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int T;
    cin >> T;
    for (int test_case = 0; test_case < T; test_case++) {
        int Answer = 0, n;
        int money[2] = {0};
        cin >> n;
        vector<int> v(n);
        for (int i = 0; i < n; i++)
            cin >> v[i];
        for (int x : v) {
            if (x == 500) {
                Answer++;
                money[0]++;
            } else if (x == 1000) {
                if (money[0]) {
                    money[0]--;
                    money[1]++;
                    Answer++;
                } else {
                    break;
                }
            } else {
                if (money[1] >= 4 && money[0] >= 1) {
                    money[1] -= 4;
                    money[0] -= 1;
                    Answer++;
                } else if (money[1] >= 3 && money[0] >= 3) {
                    money[1] -= 3;
                    money[0] -= 3;
                    Answer++;
                } else if (money[1] >= 2 && money[0] >= 5) {
                    money[1] -= 2;
                    money[0] -= 5;
                    Answer++;
                } else if (money[1] >= 1 && money[0] >= 7) {
                    money[1] -= 1;
                    money[0] -= 7;
                    Answer++;
                } else if (money[1] == 0 && money[0] >= 9) {
                    money[0] -= 9;
                    Answer++;
                } else {
                    break;
                }
            }
        }
        cout << "Case #" << test_case + 1 << '\n';
        cout << Answer << '\n';
    }
    return 0;
}

2. 폭탄 (150/150)

그리디 문제. 각 폭탄을 왼쪽, 오른쪽 중 가까운 곳까지의 거리를 구한다. 모든 폭탄이 왼쪽으로 간다면 거리의 합을 출력, 하나라도 오른쪽이 더 가깝다면 앞서 구한 거리가 가장 먼 폭탄을 들고 오른쪽으로 간다. 만약 폭탄이 하나라면 들고 왼쪽으로 가는 거리와 오른쪽으로 가는 거리를 비교한다.

#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int T;
    cin >> T;
    for (int test_case = 0; test_case < T; test_case++) {
        int Answer = 0;
        int n, l, tmp, m = 0;
        cin >> n >> l;
        if (n == 1) {
            int b;
            cin >> b;
            Answer = min(2 * b, l);
        } else {
            int flag = 0;
            for (int i = 0; i < n; i++) {
                int b;
                cin >> b;
                if (b > l / 2) {
                    flag = 1;
                }
                tmp = min(b, l - b);
                m = max(m, tmp);
                Answer += 2 * tmp;
            }
            if (flag) {
                Answer -= 2 * m;
                Answer += l;
            }
        }
        cout << "Case #" << test_case + 1 << '\n';
        cout << Answer << '\n';
    }
    return 0;
}

못 푼 문제

3. 십진수 (20/200)

수학 문제. naive 하게 구현했다가 20점을 받았다. 다른 분들 풀이를 보고 주어진 N보다 같거나 작은 가장 큰 0, 1, 2로 이루어진 수를 구하고 이를 삼진수로 취급하여 십진수로 변환한다고 한다.

총평

군 전역 이후 첫 큰 대회라 잘하고 싶은 마음은 컸지만 준비는 많이 미흡했던 것 같다. 3번 문제 풀이를 보고 앞으로는 문제를 풀 때 손으로 종이나 태블릿에 직접 작성하며 풀어야겠다고 생각했다. 눈에 보이는 것으로부터 얻는 힌트도 만만치 않은 것 같다.

(+ 2025. 7. 18. 2차 예선 진출 메일을 받았다.)

목록으로