Sehnsucht's blog

By Sehnsucht, 9 years ago, In Russian

Пытаюсь впихнуть невпихуемое задачу на битмаски, где можно брать либо 1 либо 2 предмета, с TL до 4000ms
Пока смотрю, сколько времени будет работать максимальный тест. Вот тут код:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int p = 24;     // Кол-во предметов максимум
    int al = (1 << p);      // Кол-во масок, "1" - предмет под i-тым битом уже взят
    int vec[1 << 24];    // Ответы к подзадачам
    int vec2[1 << 24];
    int inf = 1000000005;
    fill(vec, vec + al, inf);
    vector<int> kek;
    vec[0] = 0;
    for(int z = 1; z < al; z++) {
        // Вместо перебора 24 * (24 - 1) / 2 значений перебираем
        // места, где есть биты
        kek.clear();
        for(int ss = 0; ss < 24; ss++)
            if(z & (1 << ss))
                kek.push_back(ss);

        // Оптимальный ответ
        int last = inf;

        for(int a = 0; a < kek.size(); a++) {
            int az = z - (1 << kek[a]);
            if(last > vec[az] + 1)
                last = vec[az] + 1;
            for(int b = a + 1; b < kek.size(); b++) {
                int bz = az - (1 << kek[b]);
                if(last > vec[bz] + 2)
                    last = vec[bz] + 2;
            }
        }

        //vec[z] = last;
    }
}

Предполагается, что в переменной last сохраняется оптимальный ответ (конечно, не просто vec[xx]+2, а по нужной формуле расстояний между предметами kek[a] и kek[b])
Запуск codeforces этого кода в GNU C++ работает за 1309ms (погрешность +-15ms)
Если раскомментировать строку "vec[z] = last;" это работает за 4040ms
Наконец, если завести новый массив vec2 и заменить строку на "vec2[z] = last;", это работает практически за то же время что в первый раз — от 1294ms до 1310ms

Вот это прикол! Какое его научное обоснование?

  • Vote: I like it
  • +8
  • Vote: I do not like it