• Авторизация


Чемпионат СПбГУ по программированию 10-12-2006 23:50 к комментариям - к полной версии - понравилось!


В колонках играет - Арда - Мелькор
Настроение сейчас - победа!..

Только вот не в колонках, а в только что вынутой из коробки 5.1 аудио системе...

Утречко... вышел из дома не торопясь, побрел в сторону метро... по дороге сел на маршрутку, доехал до метро. хм. 9-38. подсказка - поез уходит с балтийского вокзала в 10-00, а я был на политехнической. но каким-то чудом успел, вошел в электричку за 2 секунды до закрытия дверей. отлично... доехал до универа.

Пробный тур... начало. Естественно, что-то не работает... на этот раз монитор =) доблестные админы комп класса подключили его через проэктор(на хаб денег не хватило?), а проэктор выключен. при том, что я не имею права ничего менять, пришлось пожаловаться жюри... На это ушло в общей сложности 4 минуты. каким-то образом мне все равно удалось выйграть этот пробный тур =) причем одному, мои сокомандники Юра и Капель пришли чуть позже...

Основной тур... Юра читает условия с конца, я с начала, капель с середины, я еще параллельно прописываю пути к компиляторам... юра садится писать H, я тем временем оцениваю свои задачи. A - хз как решать, надо будет дать капелю =), B - халявнейшая геометрия, С - тупое моделиование, но писать это - жопа, D - техника, ща придумаю как легко раелизовать... юра пока пишет H, ее уже 2-3 команды посдавали... E - тоже техника какая-то, но ее еще решить надо... H - accepted, пора мне написать D... тем временем капель рашает A... D - accepted, капель за компом... у ведущих команд уже 3 - D, H, I, I -решаем с юрой... решили... пока капель дебагит свое решение на листочке, пишу I... В результате сдаем примерно подрад и вырываемся в лидеры с 4-мя задачами. однако это в кубке, среди участников ЧУ перед нами только COOLier - наши вечные враги :-P Самое время мне писать B тем временем юра и капель решают G и F. кое-как сдаю B со второй попытки %) а больше мы ничего не сдадим ибо мы имбицыллы :(

После тура... подходим к кулерам. Эти идиоты так ничего после заморозки не сдали! В результате у них - второе место по университету, у нас - первое!.. Со всеми вытекающими :)
вверх^ к полной версии понравилось! в evernote
Комментарии (4):
White_Night1 12-12-2006-12:24 удалить
Я чесна даж не представляю, как ети задачки выглядят...напиши хоть одну для примера)) А по сабжу: Маладцы, что еще сказать!
Burunduk3 12-12-2006-18:04 удалить
White_Night1, спасибо. А задачу - это можно. В общем, условие такое: в файле до 20 тестов, каждый тест содержит до 20 окружностей, надо для каждого теста проверить, существует ли прямая, проходящая через все окружности этого теста, и если такая существует, вывести параметрическое уравнение любой такой прямой. Решение - генерим различные прямые и проверяем их на соответствие данному критерию, конкретнее генерим по одной прямой, проходящей через центр каждой окружности, для каждой пары окружностей прямую, соединяющую их центры и 4 общих касательных. очевидно, что еслир искомая прямая существует, то существует и прямая, которую мы переберем. Код на C++
code:
#include <cmath> #include <cstdio> #define sqr(x) ((x) * (x)) #define eps 1e-9 #define maxn 30 typedef double dbl; int N; dbl X[maxn], Y[maxn], R[maxn]; dbl AnsX, AnsY, AnsDX, AnsDY; int DoIt( dbl A, dbl B, dbl C ) { dbl D = sqrt(A * A + B * B); if (D < eps) return 0; A /= D, B /= D, C /= D; for (int i = 0; i < N; i++) if (fabs(X[i] * A + Y[i] * B + C) > R[i] + eps) return 0; dbl A2 = B, B2 = -A, C2 = 0; AnsX = (C * B2 - C2 * B) /* (A * B2 - A2 * B)*/; AnsY = -(C * A2 - C2 * A) /* (B * A2 - B2 * A)*/; AnsDX = B, AnsDY = -A; return 1; } int Do2( dbl X1, dbl Y1, dbl X2, dbl Y2, dbl D ) { dbl A = Y1 - Y2; dbl B = X2 - X1; dbl D2 = sqrt(A * A + B * B); if (D2 < eps) return 0; A /= D2, B /= D2; dbl C = -(A * X1 + B * Y1); return DoIt(A, B, C + D) || DoIt(A, B, C - D); } int main( void ) { freopen("circles.in", "rt", stdin); freopen("circles.out", "wt", stdout); int K; scanf("%d", &K); for (int Test = 1; Test <= K; Test++) { scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%lf%lf%lf", &X[i], &Y[i], &R[i]); int f = 0; for (int i = 0; i < N && !f; i++) if (DoIt(1, 0, -X[i])) f = 1; for (int i = 0; i < N && !f; i++) for (int j = 0; j < N && !f; j++) if (DoIt(Y[i] - Y[j], X[j] - X[i], -((Y[i] - Y[j]) * X[i] + (X[j] - X[i]) * Y[i]))) f = 1; for (int i = 0; i < N && !f; i++) for (int j = 0; j < N && !f; j++) if (R[i] <= R[j] + eps) { dbl R1 = fabs(R[j] - R[i]); dbl R2 = fabs(R[j] + R[i]); dbl D2 = sqr(X[i] - X[j]) + sqr(Y[i] - Y[j]); dbl D = sqrt(D2); dbl cosa = (X[j] - X[i]) / D; dbl sina = (Y[j] - Y[i]) / D; if (D2 >= R1 * R1 - eps && D2 > eps) { dbl A2 = fabs(D2 - R1 * R1); dbl A1 = sqrt(A2); dbl TX = (A2 - R1 * R1 + D2) / (2 * D); dbl TY1 = sqrt(fabs(A2 - TX * TX)); dbl TY2 = -TY1; dbl RX1 = cosa * TX - sina * TY1 + X[i]; dbl RY1 = sina * TX + cosa * TY1 + Y[i]; dbl RX2 = cosa * TX - sina * TY2 + X[i]; dbl RY2 = sina * TX + cosa * TY2 + Y[i]; if (Do2(X[i], Y[i], RX1, RY1, R[i]) || Do2(X[i], Y[i], RX2, RY2, R[i])) { f = 1; break; } } if (D2 >= R2 * R2 - eps && D2 > eps) { dbl A2 = fabs(D2 - R2 * R2); dbl A1 = sqrt(A2); dbl TX = (A2 - R2 * R2 + D2) / (2 * D); dbl TY1 = sqrt(fabs(A2 - TX * TX)); dbl TY2 = -TY1; dbl RX1 = cosa * TX - sina * TY1 + X[i]; dbl RY1 = sina * TX + cosa * TY1 + Y[i]; dbl RX2 = cosa * TX - sina * TY2 + X[i]; dbl RY2 = sina * TX + cosa * TY2 + Y[i]; if (Do2(X[i], Y[i], RX1, RY1, R[i]) || Do2(X[i], Y[i], RX2, RY2, R[i])) { f = 1; break; } } } if (f) printf("Test case %d: The circles are on (%.20lf, %.20lf) + (%.20lf, %.20lf) * t\n", Test, AnsX, AnsY, AnsDX, AnsDY); else printf("Test case %d: There are no suitable straight lines.\n", Test); } return 0; }
White_Night1 12-12-2006-18:59 удалить
ужос....Маи мозги ето не переварят


Комментарии (4): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Чемпионат СПбГУ по программированию | Burunduk3 - /var/log/messages | Лента друзей Burunduk3 / Полная версия Добавить в друзья Страницы: раньше»