페이지를 불러오는 중…
해결한 사람
3
명
정답률
100.00
%
시간 제한
1000
ms
메모리 제한
2048
MB
아마루는 가게에서 선물을 사고 있다. 선물은 가지 종류가 있다. 각 종류의 선물의 개수는 무한대이다.
각 종류의 선물은 정해진 가격이 있다. 즉, 종류 () 선물의 가격은 양의 정수인 코인 개수 로 주어진다.
아마루는 선물 종류별 가격이 모두 다르며 감소하는 순서로 주어졌다는 것을 알고 있다. 즉, 이 성립한다. 추가로, 아마루는 의 값을 알고 있다. 불행하게도 아마루는 다른 가격에 대해서는 아무것도 모른다.
몇개의 선물을 사기 위해 아마루는 상점과 여러 차례의 트랜잭션을 진행한다.
각 트랜잭션은 아래의 과정으로 진행된다:
각 트랜잭션이 시작하기 직전에 테이블 위에는 코인이나 선물이 하나도 없다는 것에 주의하라.
당신이 할 일은 아마루에게 몇차례의 트랜잭션을 하도록 지시하는 것이다. 그 목표는 다음과 같다.
아마루가 트랜잭션의 개수를 최소화할 필요는 없다. 아마루가 가진 코인은 무한히 많다.
다음 함수를 구현해야 한다.
void buy_souvenirs(int N, long long P0)
위 함수는 아래 함수를 호출해서 아마루에게 트랜잭션을 진행하도록 지시할 수 있다.
std::pair<std::vector<int>, long long> transaction(long long M)
Output isn't correct: Invalid argument의 결과를 받는다.
의 값은 입력으로 주어지지 않는다는 것에 주의하라. 의 값은 주어진다.그레이더는 적응적이지 않다. 즉, 배열의 값은 초기에 정해져 있다.
| Subtask | Score | Additional Constraints |
|---|---|---|
| 1 | ||
| 2 | (). | |
| 3 | (). | |
| 4 | ||
| 5 | (). <br> (). | |
| 6 | 추가적인 제한이 없다. |
다음 호출을 보자.
buy_souvenirs(3, 4)
선물의 종류는 가지가 있으며 이다. 배열의 내용은 다음 3가지가 가능함을 알 수 있다: , , .
buy_souvenirs 함수가 transaction(2)를 호출했고
그 리턴 값은 이었다고 하자.
리턴 값의 의미는 아마루가 종류 선물을 하나 샀고
상점은 코인 개를 되돌려 주었다는 뜻이다.
이제, 아마루는 임을 알 수 있다. 아래가 성립하기 때문이다.
transaction(2)은 을 리턴해야 한다.transaction(2)은 을 리턴해야 한다.이제 buy_souvenirs는 transaction(3)을 호출할 수 있다.
이 호출은 을 리턴할 것이다.
즉, 이 호출로 아마루는 종류 선물을 하나 샀고
상점은 개의 코인을 되돌려 주었다.
지금까지 아마루는 종류 과 종류 선물을 한개씩 샀다.
마지막으로 buy_souvenirs는 transaction(1)을 호출할 수 있고 호출은
을 리턴한다.
즉, 아마루는 방금 호출로 종류 선물을 하나 더 샀다.
transaction(2)를 사용해도 동일한 선물을 살 수 있다.
현재 시점까지 아마루는
종류 선물 하나와 종류 선물 개를 샀으므로 문제의 조건을 만족했다.
N
P[0] P[1] ... P[N-1]
Q[0] Q[1] ... Q[N-1]
는 전체 과정에서 종류 선물을 산 개수를 의미한다. ()
3
4 3 1
0 1 2
International Olympiad in Informatics (IOI) 2025, official task package and official Korean translation.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.