Привет. Давайте обсуждать здесь задачи. Интересует как решать 5 про конфеты
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Привет. Давайте обсуждать здесь задачи. Интересует как решать 5 про конфеты
Название |
---|
Может stgatilov знает))
Задача 5: Разновкусные конфеты.
Ключевая идея в том, чтобы покрасить все типы конфет в A цветов случайным образом. Теперь, если мы наберём конфеты A различных цветов, то конечно же мы и A различных типов конфет наберём. Ну, запустим динамику по подмаскам: состояние dp[i][mask] — в какую стоимость можно набрать конфеты с цветами из mask, используя первые i пачек конфет. Переходы сообразить нетрудно.
Возникает проблема: наше решение может быть неоптимальным. Ну, представим себе A конфет из оптимального решения. Мы это решение нашли, только если все эти конфеты покрасились в A различных цветов. А это и происходит с вероятностью $$$\frac{A!}{A^A}$$$. Это немаленькая вероятность. Можно позапускать наше решение много раз, пока вероятность того, что мы ни разу не покрасили конфеты из оптимального решения в A различных цветов, не станет близко к нулю.
Альтернативное решение без случайности тоже укладывалось во временные ограничения. Можно перебрать одну пачку, две, три или четыре простыми вложенными циклами. Также можно жадно брать пачки от самой дешёвой к самой дорогой, пока не наберём A конфет. И можно даже больше: перебрать одну, две или три пачки вложенными циклами, а остаток добрать жадно. Если хорошенько проработать случаи, то можно показать, что работает решение, которое делает эти переборы в нужном порядке и отсекает большие пачки по пути (например, перебрав все пары пачек, можно выкинуть все пачки размера A-1 и больше, потому что к пачке X размера A-1 не понадобится докупать больше одной другой пачки, а значит все оптимальные решения, использующие пачку X мы уже нашли).
Добавлю подробнее про решение с перебором. Там надо подумать, как A (то бишь 8) можно разложить в сумму слагаемых. Каждое слагаемое означает, сколько полезных для решения конфет мы получили из очередной пачки. Например 8 = 4 + 2 + 2 значит, что мы купили 3 пачки, и взяли из первой 4 конфеты, а из остальных двух по 2. Это разбиение покрывается перебором троек пачек. И вообще все разбиения можно покрыть описанными выше переборами. Один перебор может покрывать много разбиений, там всё довольно аккуратно:)