Блог пользователя Nerevar

Автор Nerevar, 13 лет назад, По-русски

Задача B. Футболки от спонсора.

Пронумеруем размеры футболок целыми числами от 0 до 4. Для каждого размера будем хранить количество оставшихся футболок этого размера. При обработке очередного участника мы сначала определяем номер его размера, затем одним циклом перебираем размеры футболок и из тех размеров, футболки которых еще остались, выбираем самый подходящий (т.е. с ближайшим номером).

Задача D. Парковка.

Будем хранить множество машин, которое в данный момент находится на парковке. То, как мы его будем хранить, в данной задаче не принципиально. Для каждой машины, которая в данный момент находится на парковке, будем хранить ее длину и занимаемую ей позицию. При обработке запроса типа 2 нам надо найти машину, которая должна покинуть парковку, и удалить ее из множества. Для этого мы должны нумеровать машины и по номеру запроса понимать, к какой машине он относился. Теперь рассмотрим запрос типа 1. Поскольку водитель стремится поставить машину как можно ближе к началу парковки, то мы можем сузить множество рассматриваемых вариантов положений для парковки: включим в это множество начало парковки а также все позиции, которые находятся ровно через b метров после переднего края какой-либо машины. Для каждой из этих позиций мы должны выяснить, можно ли припарковать машину в ней, а затем выбрать самую ближайшую из допустимых позиций.

Задача E. Расческа.

Пусть входная матрица называется a. Посчитаем частичные суммы в каждой строке: . Естественно, все частичные суммы надо посчитать за O(nm). Теперь будем решать задачу динамическим программированием. Пусть di, j это наибольшая сумма чисел, которую мы можем взять в первых i строках, не нарушая в них условия "расчески", при этом взяв в i-й строке j чисел. Очевидна инициализация динамики: d1, j = s1, j. Теперь определим переходы для i > 1:

1) Если i четно, то .

2) Если i нечетно, то .

Вычисление значений di, j непосредственно по этим формулам имеет асимптотику O(nm2). Теперь заметим, что если в случае, когда i четно, перебирать j по убыванию, а если нечетно, то по возрастанию, и вычислять di, j в таком порядке, то максимум значений di - 1, k в предыдущей строке можно не вычислять каждый раз, а считать по ходу. Такое решение будет иметь сложность O(nm) и будет проходить все тесты.

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Hi,

I followed the DP showed here, but I keep getting WA! :( I was WAing in testcase 2 at first, and then I realised the bug is that i used %lld instead of %I64d. However, even after I changed that, I still get WA for testcase 3 :(. Can someone help me?

My code is shown below:

http://pastebin.com/yZJje5KZ

EDIT: Oops sorry, forgot to mention which question I was talking about. I am trying to solve Comb.
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
  1.         for(int j=1;j<=Y;++j){
  2.                 dp[1][j] = A[1][j];
  3. //              printf("dp[%d][%d] = %lld\n",1,j,dp[1][j]);
  4.         }
WRONG !
  1.         for(int j=Y;j>=1;--j){
  2.                 dp[1][j] = max(A[1][j],dp[1][j + 1]);
  3. //              printf("dp[%d][%d] = %lld\n",1,j,dp[1][j]);
  4.         }
  5. or something like this.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
For some reason, my browser can't load the images in the blog post... If I remove the ":8080" port from the image URL, I can load them... so, I guess, the question is -- why do we need that port in the URL and can it be avoided in order for people like me to see them in the text? =)