QOJ.ac

QOJ

시간 제한: 2.0 s 메모리 제한: 1024 MB 총점: 100

#25312. แคง (Kang)

통계

有一款被譽為考驗智慧嘅紙牌遊戲,叫做「แคง (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 次。最好嘅做法係揀將 2 張分數係 $6$ 嘅牌揼走,令淨低嘅牌嘅總分去到最細值 $3 + 9 + 3 + 4 = 19$。

情況 $k = 2$:如果你可以喺檯面摸 2 張牌,最好嘅方法係:摸咗第一張分數係 $4$ 嘅牌之後,你揀揼走一張分數係 $9$ 嘅牌,手上面淨低嘅牌分數係 $6, 3, 6, 3, 4$。跟住當摸第 2 張分數係 $6$ 嘅牌嗰陣,你可以揼走 3 張分數係 $6$ 嘅牌,令淨低嘅牌嘅總分最細,等於 $3 + 3 + 4 = 10$。

情況 $k = 3$:如果你可以喺檯面摸 3 張牌,最好嘅方法係:當你摸咗第一張牌之後,手上面嘅牌分數會係 $6, 3, 9, 6, 3, 4$。跟住揀將分數相同嘅牌揼走 1 次,最好嘅做法係將 2 張分數係 $3$ 嘅牌全部揼晒,手上面會淨低 $6, 9, 6, 4$。跟住當摸第 2 張分數係 $6$ 嘅牌嗰陣,你可以揼走 3 張分數係 $6$ 嘅牌,手上面會有 $9, 4$。而當你第 3 次摸分數係 $9$ 嘅牌嗰陣,你可以將 2 張分數係 $9$ 嘅牌全部揼晒,令淨低嘅牌嘅總分變成 $4$。

情況 $k = 4$:如果你可以喺檯面摸 4 張牌,最好嘅方法係:摸咗第一張分數係 $4$ 嘅牌之後,揀揼走一張分數係 $4$ 嘅牌,手上面淨低嘅牌分數係 $6, 3, 9, 6, 3$。跟住第 2 次摸嘅牌分數係 $6$,最好嘅做法係將 2 張分數係 $3$ 嘅牌全部揼晒,手上面淨低 $6, 9, 6, 6$。第 3 次摸嘅牌分數係 $9$,揀將 2 張分數係 $9$ 嘅牌全部揼晒。最後摸最尾一張分數係 $6$ 嘅牌嗰陣,你可以揼走 4 張分數係 $6$ 嘅牌。呢次棄牌之後手上面一張牌都冇淨,即係話牌嘅總分係 $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 個檔案。參賽者應該用 text editor 或者 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.