4 августа в 15:00 MSD состоится очередной TopCoder SRM
№ | Пользователь | Рейтинг |
---|---|---|
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 | 155 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | nor | 152 |
Название |
---|
спасибо за напоминание!
удачи всем;)
Тестер должен проверить, чтобы все эти части были корректны, согласовались друг с другом, и чтобы они были качественными. Ну например, ограничения в условии должны согласоваться с авторским решением, которое не должно пропускать тесты, которые им не удовлетворяют. А сами тесты должны достаточно полно покрывать ограничения в условии.
Считаем дп по маскам, f[i]--максимальный профит от маски i бутылок.
Также препроцессингом за 2^15 просчитаем массив a[i]--профит, если мы разольем маску i бутылок так, чтобы было максимально полных бутылок, одна частично(от 0 до c) заполненная, а остальные пустые.
И как считаем--если у нас есть ответ для маски i, то мы перебираем все остальные маски, не пересекающиеся с i(для оптимизации я считал в новой "цепочке" мы будем всегда использовать самый левый нулевой бит маски i) и обновляем ответ f[mask | newmask]=max(f[mask |newmask],f[mask]+a[newmask])
Фактически получается мы считаем максимальную прибыль, если мы уже использовали какой-то множество I бутылок и причем в одной активной бутылке из использованных находится K литров сока причем мы еще не посчитали прибыль за эту бутылку, объем сока еще может измениться в ней.
Тогда для пересчета мы просто смотрим бутылку J которую мы не использовали и с ней мы можем сделать несколько операций:
(dm[I][K] мы уже посчитатли. J не принадлежит I)
-просто использовать, т.е. добавить прибыль за эту бутылку
dm[I+(1 << J)][K] = max(dm[I+(1 << J)][K], prices[bottle[J]] + dm[I][K]);
-сделать ее активной
dm[I+(1 << J)][bottle[J]] = max(dm[I+(1 << J)][bottle[J]], prices[K] + dm[I][K]);
-перелить в активную бутылку
если bottle[j] + k < C
dm[I + (1 << J)][botlle[J] + K] = max(dm[I + (1 << J)][botlle[J] + K], dm[I][K] + prices[0]);
иначе
dm[I + (1 << J)][botlle[J] + K - C] = max(dm[I + (1 << J)][botlle[J] + K], dm[I][K] + prices[C]);
В практисе сразу же сдал, когда увидел оплошность
1) x*4+3 и x*8+7 коммутируют между собой, то есть неважно в каком порядке выполнять операции, можно считать, что сначала мы делаем сколько-то операций первого типа, а потом сколько-то второго.
2) ясно, что мы просто выполняет все операции в кольце вычетов по модулю 10^9+7. это всем известное простое число, ура =) значит мы можем делить на 4 и на 8.
сделаем 100 000 обратных операций первого типа от нуля, запишем в мап, а потом 100 000 операций другого типа от числа init.
Например:... map< string,int >a ...; Дальше в коде можна использовать a["one"] и прочее. Вообщем много хорошых вещей дает map.(поисчи в нете)
Но я думаю это в принципе аналог)
Это одно и тоже, если ты хочешь просто улучшать и получать значения по указанному ключу. А вот если ты хочешь найти значение для наиболее близкого к заданному ключу, то Dictionary в C# не поможет, а в C++ ты можешь сказать "дай мне элемент из карты, ключ которого минимален из всех, которые не превышает данного", lower_bound, и я знаю сотни задач, которые этим решаются.
В C# тоже есть деревья - SortedDictionary. Поразительный по своей бесполезности класс, потому что в нем нет метода LowerBound, который однозначно от него ожидается.
В SortedDictionary конечно можно, обычным foreach.
это не карта, это отображение