페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#3112
스페셜 저지
인터랙티브

보안 시스템 1초 128MB

문제

시훈이와 동현이는 기밀자료를 다루는 연구기관의 관리자입니다.

연구기관은 자료의 등급에 따라 여러 단계의 보안시스템을 통과해야 자료에 접근할 수 있습니다.

 

가장 중요한 자료는 시훈이와 동현이만 접근할 수 있습니다.

가장 중요한 자료인 일급비밀에 대한 보안 시스템을 고민하던 시훈이와 동현이는 필요로 하는 요구사항을 정리해 보기로 하였습니다.

1. 시훈이와 동현이는 함께 또는 각각 보안시스템을 통과할 수 있어야 합니다.

2. 시훈이가 암호를 걸어도 동현이가 풀 수 있어야 하고, 동현이가 암호를 걸어도 시훈이가 풀 수 있어야 합니다.

3. 자료에 빈번하게 접근해야 하므로 질문과 응답이 빠르게 이루어져야 합니다.

고민을 거듭하여 두 사람은 다음과 같은 시스템을 만들었습니다.

1. 시스템은 두 자연수 x, y (1<= x, y <= 920,  x ≠ y)를 관리자에게 제시하여 하나의 자연수로 암호화 하도록 요구합니다. 

   이 기능을 하는 함수를 encoding(x, y)라고 정의하고 이 함수는 암호화된 수 k ( 1 <= k ) 를 반환합니다.

   시스템은 두 자연수 x, y, k에 대한 정보를 보관합니다.

2. 일급기밀자료에 접근을 요구하는 경우 위 1번의 정보를 기초로 시스템은 가지고 있는 정보 중에 임의의 두 자연수 p, k를 제시합니다. 

   이때 접근을 요구한 사람은 p가 x라면 ‘x‘를 y라면 ’y‘라고 응답해야 보안시스템을 통과할 수 있습니다. 

   그렇지 않다면 경보가 울립니다.

   이 기능을 하는 함수를 answer(p, k)라고 하고 ‘x’또는 ‘y’를 반환합니다.

3. 위 1 또는 2번 질문을 최대 2,000,000번 할 수 있으며 이를 통과해야 일급비밀자료에 접근할 수 있습니다.

 

[해야 할 일​]

아래 제약사항과 채점 기준에 맞도록

encoding(int x, int y);​ 함수와

​char answer(int p, int k); 함수를 작성 합니다.​

 

[제약사항]

sample code를 를 다운로드 합니다.

두 개의 코드 샘플은 사용자가 작성해야 하는 코드의 예를 나타내는 것 뿐입니다.

올바른 정답을 보여주지 않을 수 있습니다.

또한 채점을 위한 파일은 manager.cpp의 내용과는 다릅니다. 

사용자는 mysolution.cpp파일에 [해야 할 일]에서 주어진 두 개의 함수를 작성합니다.

[제한사항]

주어진 메모리 범위에서 전역 및 static변수를 사용할 수 있다.

[C, C++ template code]

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

 /*

Template Code

*/

 

/// *** mysolution.cpp ***

int encoding(int x, int y) {

 

}

char answer(int p, int k) {

 

}

 

/// *** manager.cpp ***

#include <stdio.h>

 

extern int encoding(int x, int y);

extern char answer(int q, int h);

 

static int score() {

    int krr[5= { 0 }, max_k = 0;

    int scoreTable[] = { 100100100100100100,

                         100100100100100100,

                         10075605042343330270 };

 

    krr[0= encoding(12);

    if (krr[0<= 0return 0;

    if (answer(1, krr[0]) != 'x'return 0;

 

    krr[1= encoding(45);

    if (krr[1<= 0return 0;

 

    if (answer(2, krr[0]) != 'y'return 0;

 

    if (answer(4, krr[1]) != 'x'return 0;

 

    krr[2= encoding(52);

    if (krr[2<= 0return 0;

 

    if (answer(2, krr[2]) != 'y'return 0;

 

    for (int i = 0; i < 3++i) {

        if (max_k < krr[i]) max_k = krr[i];

    }

 

    if (max_k >= 21) max_k = 21;

    return scoreTable[max_k];

}

 

int main() {

    printf("%d", score());

    return 0;

}

 

 

예제

Function Call

Returns

encoding(1,2)

12

answer(1,12)

x

encoding(4,5)

2

answer(2,12)

y

answer(4,2)

x

encoding(5,2)

1

answer(2,1)

y

 

[채점 기준]

여러분 프로그램의 점수는 모든 x, y 에 대해 encoding(x, y) 가 return 하는 최대 k값으로 결정된다.

또한 answer(p, k) 의 return 값이 모두 정확하게 맞아야 한다. 

그렇지 않은 경우 0점으로 처리된다.

 

최대 k

점수

>= 21

0

20

10

19

20

18

30

17

40

16

50

15

60

14

70

13

80

<=12

100

 


출처

CEOI 2014

역링크 공식 문제집만