Editorial for IOI '16 P1 - Detecting Molecules
Submitting an official solution before solving the problem yourself is a bannable offence.
Subtask 1 is a special case. Iterate all possible , and try to take exactly
molecules.
Subtask 2 is a special case. Iterate all possible , try to take exactly
molecules of minimal weight and exactly
molecules of maximal weight.
Subtasks 3 and 4 may be solved using dynamic programming. The task is a classic knapsack problem. Use of time, and
of space.
You may optimize the dynamic programming, use bitset
and you'll pass Subtask 5.
We suggested, a contestant who solves Subtasks 5 and 6 will invent a greedy approach. If you implement greedy in , you'll pass only Subtask 5. Good time to pass Subtask 6 is
.
There are 3 correct greedy solutions. All of them start with sorting the array of weights in nondecreasing order.
Greedy 1. Let fix , number of molecules to take. We can choose set of size
with sum in
iff
and
. Where
is partial minimums on prefixes and
is partial maximums on suffixes. Both of them may be precalculated in
.
Proof. Let's take minimal possible molecules, its summary weight does not exceed
. Let's change the set smoothly from "
minimal molecules" to "
maximal molecules". One step: drop any one molecule, and take any other. Each step changes the sum by at most
. The last value of the sum is at least
. So one of the intermediate steps gives
. ■
Greedy 2. There exists an answer which forms a segment. Use two pointers to find it in .
Proof. Let's fix – number of molecules in the answer. The smallest
molecules form the leftmost segment, and the biggest
form the rightmost segment. Let's change the set smoothly from "the leftmost segment" to "the rightmost segment". One step: drop the leftmost molecule, and add a new one at the right. ■
Greedy 3. There exists an answer which forms a union of prefix and suffix. Use two pointers to find it in .
Proof. Let's fix – number of molecules in the answer. The smallest
molecules form prefix, the biggest
form suffix. Let's change the set smoothly from "prefix" to "suffix". One step: make prefix shorter by one, make suffix longer by
. ■
Comments