Тренировки

4 комментария
Василий А.
28 января 2016, 03:05

А) будем строить в обратную сторону мы можем или домножать число на 2 или вычитать 1 и делить на 3, только если число четно и сравнимо с 1 по модулю 3. Заметим что учитывая условия раздвоений у нас будет не слишком много (порядка 1/4 от всех шагов), таким образом полный перебор успевает.

B) нужно проверить совпадает ли множество доминошек, далее найти первую доминошку слева которую надо поменять и поменять её (с помощью данных преобразований и условие на совпадение множеств доминошек это всегда можно сделать операции видимо надо делать с помощью rope

C) нужно найти точку пересечения серединных пперпендикуляров или понять что ее нет

D) надо свести граф к 16 вершинам (дейкстрой), а дальше с помощью масочки посещенных чекпоинтов провести

E) число компонент связности, решает любой обход

F) надо определить перестановку ABCDE возвести ее в степень M/5 а потом добрать оставшимися и посмотреть

G) просто посчитать

H) судя по всему девелопер выполняет задания по порядку, тогда это просто динамика, по минимальному времени выполнения i заданий l чашками кофе

I) надо возвести матрицу 2 х 2 в степень по модулю 10, ну или просто цикл найти у этой последовательности

J) для каждой точки найти ближайший справа первый и второй луз (аналогично с ничьими), для отрезка контрактов длины от первого луза до второго прибавить сумму к ответу

K) наибольшие палиндромы для каждого символа(как центрального) ходом за линию (похоже на построение z-функции) а далее структурками тоже все делается

L) Дейкстра - состояние количество монстров, количество жизней у первого и второго. максимизируем число имеющейся маны

Я так и не осилил вчера задачу С. WA 15. Не подскажете что там за тест?

 

Если интересно вот код.

 

        int x[4], y[4];

rep(i,3) cin >> x[i+1] >> y[i+1];

 

 

FOR(i,1,4) FOR(j,i+1,4) if(x[i]>x[j] || x[i]==x[j]&&y[i]>y[j]) {

swap(x[i],x[j]);

swap(y[i],y[j]);

}

 

bool same = true;

rep(i,2) same &= x[1]==x[i+2] && y[1]==y[i+2];

if(same) {  // все точки совпадают

cout.precision(6);

cout << fixed << double(x[1]) << " " << double(y[1]) << endl;

return 0;

}

 

if(x[1]==x[2]&&y[1]==y[2]) { // только две точки совпадают

assert(x[2]!=x[3] || y[2]!=y[3]);

cout.precision(6);

cout << fixed << double(x[2]+x[3])/2 << " " << double(y[2]+y[3])/2 << endl;

}

 

if(x[3]==x[2]&&y[3]==y[2]) { // только две точки совпадают

assert(x[2]!=x[1] || y[2]!=y[1]);

cout.precision(6);

cout << fixed << double(x[2]+x[1])/2 << " " << double(y[2]+y[1])/2 << endl;

}

 

if((y[2]-y[1])*(x[3]-x[2]) == (y[3]-y[2])*(x[2]-x[1])) { // точки на прямой

cout << "NO\n";

return 0;

}

// общий случай

int a1 = - 2*x[1] + 2*x[2];

int a2 = - 2*x[2] + 2*x[3];

int b1 = - 2*y[1] + 2*y[2];

int b2 = - 2*y[2] + 2*y[3];

int c1 = x[1]*x[1] - x[2]*x[2] + y[1]*y[1] - y[2]*y[2];

int c2 = x[2]*x[2] - x[3]*x[3] + y[2]*y[2] - y[3]*y[3];

int z1 = dot(b1, c1, b2, c2);

int z2 = -dot(a1, c1, a2, c2);

int z3 = dot(a1, b1, a2, b2);

 

assert(z3!=0);

 

cout.precision(6);

cout << fixed << double(z1)/z3 << " " << double(z2)/z3 << endl;

Егор Кленин
28 января 2016, 03:05

будет ли завтра тренировка?

Василий А.
28 января 2016, 03:05
Нет