Home Codeforces Round #726 (Div. 2) 후기
Post
Cancel

Codeforces Round #726 (Div. 2) 후기

3학년 1학기 끝나자마자의 contest 참여이다. 아마 결과는 처참하지 않을까 예상한다.

A. Arithmetic Array

풀이 보기

풀이

모든 원소의 합 $A$가 $k$와 같도록 조정하는 문제이다. 다만 추가할 수 있는 수가 음이 아닌 정수이므로, 만약 $A > k$라면 추가할 수 있는 숫자는 $0$뿐이다.

만약 $A = k$라면 수를 추가하지 않아도 평균을 1로 만들 수 있다.
만약 $A < k$라면 양수 하나만을 추가하여 평균을 1로 만들 수 있다. ( 이 때 추가하는 수는 아마도 $k - A + 1$일 것이다. )
만약 $A > k$라면 $A - k$만큼의 $0$이 추가로 필요하므로, 이것이 답이 된다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        int sum = 0;
        for (int i = 0; i < n; ++i) {
            int a;
            scanf("%d", &a);
            sum += a;
        }

        if (sum == n) {
            printf("0\n");
        }
        else if (sum < n) {
            printf("1\n");
        }
        else {
            printf("%d\n", sum - n);
        }
    }
    return 0;
}

B. Bad Boy

풀이 보기

풀이

직관적인 문제이다. 가장 멀리 순회하기 위해서는 가장 겉부분을 돌면 된다는 간단한 원리를 눈치채면 풀 수 있는 문제이다.

고로 가장 큰 직사각형의 꼭짓점인 (1, 1)과 (n, m)을 방문하도록 지정하면 된다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int a, b, c, d;
        scanf("%d %d %d %d", &a, &b, &c, &d);
        printf("%d %d %d %d\n", 1, 1, a, b);
    }
    return 0;
}

C. Challenging Cliffs

풀이 보기

풀이

$n$개의 산이 있는데, 이것을 이용하여 difficulty를 $n-1$로 만드는 것이 정답이다.

우선 주어진 조건에 따라 $|h_1 - h_n|$이 최소가 되는 두 개의 산을 찾아야 한다. 이것은 정렬된 산들을 이용하여 양옆의 산과 비교하면 쉽게 찾을 수 있다.

이후 그것을 양 옆에 배치하고, 정렬된 순서대로 산을 놓는다. 늘어놓은 모습을 앞에서 보게 된다면 번개 모양이 되도록 조정한다.

만약 정렬된 배열에서 양 끝점의 산의 index가 $a$, $a+1$이라고 한다면 아래와 같은 순서로 산을 선택한다. $[a+1, a+2, … n, 1, 2, …, a]$

이러면 $n$ -> $1$인 지점에서만 난이도가 증가하지 않으므로 난이도는 $n-1$이 되며 최대를 나타낸다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

#define MAX_IDX (int)2e5

int cmp(int* a, int* b) {
    return *a - *b;
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int arr[MAX_IDX];
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) {
            scanf("%d", arr + i);
        }

        qsort(arr, n, sizeof(int), cmp);

        if (n == 2) {
            printf("%d %d\n", arr[0], arr[1]);
        }
        else {
            int diff = arr[1] - arr[0];
            int s1 = 0, s2 = 1;
            for (int i = 1; i < n - 1; ++i) {
                if (arr[i + 1] - arr[i] < diff) {
                    diff = arr[i + 1] - arr[i];
                    s1 = i, s2 = i + 1;
                }
            }

            for (int i = s2; i < n; ++i) {
                printf("%d ", arr[i]);
            }
            for (int i = 0; i <= s1; ++i) {
                printf("%d ", arr[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

결과

ContestStart timeRankSolvedRating changeNew rating
#726 (Div. 2)2021/6/18
23:35
53023-471492

3문제를 풀었는데, 누구든 당연하게 풀 수 있는 난이도의 문제들뿐이어서 점수가 상향평준화된 것 같다. D가 E1보다 어려워서 이 부분에서 시간을 더 많이 잡아먹은 것이 패인인 것 같다.

This post is licensed under CC BY 4.0 by the author.