QOJ.ac

QOJ

Time Limit: 2.0 s Memory Limit: 1024 MB Total points: 100

#25312. แคง (Kang)

Statistics

지성의 시험대라고 불리는 한 카드 게임이 있으며, 그 게임의 이름은 “แคง (Kang)”입니다. 이 게임에서 각 카드는 양의 정수로 된 점수를 가집니다. 게임을 시작할 때 당신은 $N$장의 카드를 받아 손에 쥐고 있으며, 테이블 위에는 또 다른 $M$장의 카드가 왼쪽에서 오른쪽으로 앞면이 보이도록 놓여 있습니다. 당신은 손에 받은 카드와 테이블 위에 놓인 카드 모두의 점수를 볼 수 있습니다. 그다음 당신은 테이블 위의 카드를 $k$라운드에 걸쳐 추가로 가져올 수 있는데, 반드시 왼쪽에서 오른쪽 순서대로 한 번에 한 장씩 가져와야 합니다. 각 라운드에서 카드를 가져온 후, 당신은 손에 있는 카드 중 점수가 같은 카드를 원하는 장수만큼 골라 버리는 동작을 1번 할 수 있습니다. 당신은 테이블에서 카드를 가져오고 손에서 카드를 버리는 과정을 $k$라운드 모두 마친 후, 손에 남은 카드들의 점수 합이 최소가 되도록 플레이 계획을 세워야 합니다.

다음 예를 생각해 봅시다.

처음에 당신이 다섯 장의 카드를 가지고 있고 그 점수가 $6, 3, 9, 6, 3$이며, 테이블 위에 왼쪽에서 오른쪽으로 놓인 카드의 점수가 $4, 6, 9, 6$이라고 합시다.

$k = 1$인 경우: 테이블 위의 카드를 단 1장만 가져올 수 있다면, 첫 번째 카드를 가져왔을 때 당신이 가진 카드의 점수는 $6, 3, 9, 6, 3, 4$가 됩니다. 그 후 점수가 같은 카드를 골라 1번 버릴 수 있는데, 가장 좋은 방법은 점수가 $6$인 카드 2장을 골라 버리는 것이며, 이때 남은 카드의 점수 합은 최솟값인 $3 + 9 + 3 + 4 = 19$가 됩니다.

$k = 2$인 경우: 테이블 위의 카드를 2장 가져올 수 있다면, 가장 좋은 방법은 다음과 같습니다. 점수가 $4$인 첫 번째 카드를 가져온 후, 점수가 $9$인 카드 한 장을 버리는 것을 선택합니다. 손에 남은 카드의 점수는 $6, 3, 6, 3, 4$가 됩니다. 그 후 점수가 $6$인 2번째 카드를 가져왔을 때, 점수가 $6$인 카드 3장을 버릴 수 있으며,이로써 남은 카드의 점수 합은 최솟값인 $3 + 3 + 4 = 10$이 됩니다.

$k = 3$인 경우: 테이블 위의 카드를 3장 가져올 수 있다면, 가장 좋은 방법은 다음과 같습니다. 첫 번째 카드를 가져왔을 때 손에 있는 카드의 점수는 $6, 3, 9, 6, 3, 4$가 됩니다. 그 후 점수가 같은 카드를 골라 1번 버릴 수 있는데, 가장 좋은 방법은 점수가 $3$인 카드 2장을 모두 버리는 것이며 손에는 $6, 9, 6, 4$가 남습니다. 그다음 점수가 $6$인 2번째 카드를 가져왔을 때 점수가 $6$인 카드 3장을 버릴 수 있어 손에는 $9, 4$가 남게 됩니다. 그리고 점수가 $9$인 카드를 3번째로 가져왔을 때 점수가 $9$인 카드 2장을 모두 버릴 수 있어, 남은 카드의 점수 합은 $4$가 됩니다.

$k = 4$인 경우: 테이블 위의 카드를 4장 가져올 수 있다면, 가장 좋은 방법은 다음과 같습니다. 점수가 $4$인 첫 번째 카드를 가져온 후 점수가 $4$인 카드 한 장을 버리는 것을 선택하면, 손에 남은 카드의 점수는 $6, 3, 9, 6, 3$이 됩니다. 그다음 2번째로 가져오는 카드의 점수는 $6$인데, 가장 좋은 방법은 점수가 $3$인 카드 2장을 모두 버리는 것이며 손에는 $6, 9, 6, 6$이 남습니다. 3번째로 가져오는 카드의 점수는 $9$이며, 점수가 $9$인 카드 2장을 모두 버리는 것을 선택합니다. 그리고 점수가 $6$인 마지막 카드를 가져올 때, 점수가 $6$인 카드 4장을 버릴 수 있습니다. 이번 버리기로 인해 손에 남은 카드가 없게 되며, 이는 카드의 점수 합이 $0$임을 의미합니다.

당신의 과제 (Your Task)

$k = 1, 2, 3, \ldots, M$일 때, $k$라운드가 끝난 후 “손에 남은 카드들의 점수 합의 최솟값”을 구하세요.

이 문제는 실제 대회에서 사용되는, 일반적인 형식과는 다른 프로그래밍 형식을 가집니다. 사용 방법에 대해서는 이 문제의 마지막 부분을 참고해 주세요.

구현 세부사항

다음 함수를 작성해야 합니다:

std::vector<long long> capsize(std::vector<int> A, std::vector<int> B)

매개변수는 다음과 같습니다:

  • $A$는 길이 $N$인 배열로, 시작할 때 손에 있는 카드들의 번호를 나타냅니다.
  • $B$는 길이 $M$인 배열로, 테이블 위에 놓인 카드들의 번호를 왼쪽에서 오른쪽 순서대로 나타냅니다.
  • 이 함수는 길이 $M$인 배열 $C$를 반환해야 하며, 이는 $k = 1, 2, 3, \ldots, M$일 때 $k$라운드 동안 가능한 손에 남은 카드들의 점수 합의 최솟값을 나타냅니다.

예를 들어, $A = [6, 3, 9, 6, 3]$이고 $B = [4, 6, 9, 6]$이라면, 함수는 배열 $[19, 10, 4, 0]$을 반환해야 합니다.

제한

  • $1 \le N, M \le 10^6$
  • $1 \le i \le N$인 각 $i$에 대해 $1 \le A[i] \le 10^9$
  • $1 \le i \le M$인 각 $i$에 대해 $1 \le B[i] \le 10^9$

서브태스크

테스트 그룹 이 테스트 그룹의 최대 점수 조건
1 5% $N, M \le 5$
2 7% $N \le 1\,000$ 그리고 $M = 1$
3 8% $N, M \le 1\,000$, 모든 카드(손에 있는 카드와 테이블에 놓인 카드 모두)의 번호가 서로 다름
4 12% $N, M \le 1\,000$, 추가로 받아오는 모든 카드의 값이 같음
5 16% $N, M \le 1\,000$
6 28% $N, M \le 100\,000$
7 24% 추가 제한 조건 없음

참고

프로그래밍 안내

이 문제에서는 프로그램을 작성하여 그레이더(Grader) 시스템에 제출하는 방식이, 참가자가 입력을 받는 부분과 출력을 표시하는 부분을 직접 작성해야 하는 일반적인 프로그래밍 형식과 다릅니다. 이 문제에서 참가자는 지정된 함수 안에 필요한 계산 부분만 작성해야 합니다. 여러 입력 데이터는 함수의 매개변수를 통해 사용할 수 있으며, 계산 결과 또한 함수를 통해 반환해야 합니다. 참가자는 입력을 받는 부분의 프로그램을 작성할 필요가 없으며 출력 부분을 작성할 필요도 없습니다.

참가자에게는 다음과 같이 여러 파일이 제공됩니다. 참가자는 문제에서 지정한 단 하나의 파일만 수정하여 그 파일을 시스템에 제출해야 합니다:

  • grader.cpp는 입력을 받고 출력을 내보내는 역할을 하는 메인 파일입니다.
  • kang.cpp는 참가자가 여러 계산 프로그램을 작성해야 하는 파일이자 시스템에 제출하는 파일입니다(kang.cpp 파일 안에는 main() 함수가 없어야 하지만, 다른 함수들은 있을 수 있습니다).
  • run_cpp.sh는 참가자가 전체 프로그램을 실행하기 위해 호출할 수 있는 파일입니다.
  • compile_cpp.sh는 참가자가 프로그램을 컴파일하기 위해 호출할 수 있는 파일입니다.

참가자는 시스템에서 다운로드할 수 있는 .zip 파일을 받게 되며, 해당 파일의 압축을 풀면(extract) 4개의 파일이 모두 들어 있습니다. 참가자는 텍스트 에디터나 IDE를 사용하여 kang.cpp 파일을 수정하고, compile_cpp.sh 또는 run_cpp.sh를 호출하여 프로그램을 컴파일하거나 실행해야 합니다.

참가자가 프로그램을 실행하기 위해 run_cpp.sh 파일을 호출하면, 프로그램은 grader.cpp 파일에 명시된 대로 동작하며 “그레이더 파일 설명” 항목에서 해당 파일의 동작 방식을 설명합니다.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.