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

Codeforces Round #695 (Div. 2) 후기

오랜만에 contest에 다시 참여하였다. SCPC 2라운드에서의 경험을 맛보고, 학기를 끝낸 후에 그 동안 하지 못했던 PS를 다시 연습하는 시간을 가지려 contest에 참여하였다.

A. Wizard of Orz

풀이 보기

풀이

주어진 길이를 가진 수 중 가장 큰 숫자를 출력해야하므로, 가장 앞자리의 숫자는 $9$여야 한다.

뒤의 숫자는 앞과의 숫자와 차이가 1씩 떨어지면 된다. 요점은 어디에서 반전시킬 것인가이다.

만약 $n=3$이라면 정답은 $989$이다. 또 $n=4$라면 정답은 $9878$이 아닌 $9890$이다. 또 $n=5$라면 정답은 $98789$가 아닌 $98901$이다. 반전시키는 위치는 항상 2번째 자리인 것을 찾아내야 한다.

$n=1$이라면 $9$, $n=2$라면 $98$을 출력하고, 그 이후는 남은 자리수만큼 $0123456789$를 반복하여 출력하면 정답을 출력할 수 있다.

코드

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() {
    #define MAX_INDEX (int)2e5
    char str[MAX_INDEX + 1];
    int t;
    for (scanf("%d", &t); t; --t) {
        int n;
        scanf("%d", &n);
        if (n == 1) {
            printf("9\n");
        }
        else {
            str[0] = '9', str[1] = '8';
            int k = 9;
            for (int j = 2; j < n; ++j) {
                str[j] = k + '0';
                if (++k > 9) {
                    k = 0;
                }
            }
            str[n] = '\0';
            printf("%s\n", str);
        }
    }
    return 0;
}

B. Hills And Valleys

풀이 보기

Not solved
result : Wrong answer on pretest 3 ( pretest )

풀이

배열의 각 숫자에 대해 앞의 원소와의 관계를 이용하려하였다. 값이 아닌 증감만을 따로 기록하여 1개 ~ 3개 중 어떤 값까지 추가로 제거할 수 있는지를 판별하려 하였다.

반례가 있는 것인지, 아니면 이 방식으로 푸는 문제가 아닌지 확신이 들지 않는다. 나중에 따로 시간을 들여 풀어보아야겠다.

코드

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) > (b)) ? (b) : (a))
 
typedef char boolean;
#define True 1
#define False 0
 
#define SAME 0
#define UP 1
#define DOWN 2
typedef struct Node {
    int v;
    int m;
} N;
 
#define NOT 0
#define HILL 1
#define VALLEY 2
 
int main() {
    int t;
    for (scanf("%d", &t); t; --t) {
        #define MAX_INDEX (int)3e5
        N arr[MAX_INDEX];
        char hill[MAX_INDEX] = { NOT };
        int n;
        int result = 0;
        int canBeErase = 1;
        scanf("%d %d", &n, &arr[0].v);
        arr[0].m = SAME;
        for (int i = 1; i < n; ++i) {
            int a;
            scanf("%d", &a);
            if (arr[i - 1].v < a) {
                arr[i] = (N) { a, UP };
            }
            else if (arr[i - 1].v > a) {
                arr[i] = (N) { a, DOWN };
            }
            else {
                arr[i] = (N) { a, SAME };
            }
        }
        for (int i = 1; i < n - 1; ++i) {
            if (arr[i].m + arr[i + 1].m == 3) {
                ++result;
                if (arr[i].m == UP) {
                    hill[i] = HILL;
                }
                else {
                    hill[i] = VALLEY;
                }
            }
            else {
                hill[i] = NOT;
            }
        }
        if (result == 0 || (n == 4 && result == 2)) {
            printf("0\n");
        }
        else {
            for (int i = 2; i < n - 2; ++i) {
                if (hill[i] == HILL && hill[i - 1] == VALLEY && hill[i + 1] == VALLEY ||
                    hill[i] == VALLEY && hill[i - 1] == HILL && hill[i + 1] == HILL) {
                    canBeErase = 3;
                    break;
                }
                else if (hill[i - 1] == HILL && hill[i] == VALLEY && hill[i + 1] == NOT && (arr[i + 1].v >= arr[i - 1].v || arr[i + 1].m == SAME) ||
                    hill[i - 1] == VALLEY && hill[i] == HILL && hill[i + 1] == NOT && (arr[i + 1].v <= arr[i - 1].v || arr[i + 1].m == SAME)) {
                    canBeErase = max(canBeErase, 2);
                }
            }
            printf("%d\n", result - canBeErase);
        }
    }
    return 0;
}

결과

ContestStart timeRankSolvedRating changeNew rating
#695 (Div. 2)2021/1/8
23:35
47621-91398

B번 문제의 정답을 오래 고민했지만 풀어내지 못했다. 1문제밖에 풀지 못해 rate가 많이 떨어질 것을 예상하였으나, 예상 외로 rank가 낮지 않았다. B번 문제에서 많이 떨어져 나간 것 같다. 그래도 rate는 1400점 이하로 떨어졌고, 다시 pupil에 진입하였다.

1문제밖에 풀지 못한 것도 아쉬웠고, specialist를 잃어버린 것도 아쉬웠다. 다음 contest에서는 specialist를 다시 얻기 위한 노력을 해야겠다.

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