Страница: 1 | 2 | 3 |
Вопрос: Олимпиада (C++, Delphi)
Добавлено: 04.10.05 14:37
Автор вопроса: HACKER
Ответы
Всего ответов: 41
Номер ответа: 16
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #16
Добавлено: 07.10.05 20:26
чисто на Cи, без асма, низя сказали асмовские вставки...
Номер ответа: 17
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #17
Добавлено: 08.10.05 03:02
На олимпиадах ассемблерные вставки запрещают, а то бы у меня давно уже на всех олимпиадах полные баллы были и пароли на Инет заодно Функция pow предназначена для вещественных чисел.
Номер ответа: 18
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #18
Добавлено: 08.10.05 04:55
я тут кое чё накодил, про линии, только трабла маленькая, думаю знающие поправят меня. Дело в том что при присваивании массвам IntersectionX и IntersectionY все данные что были в нём до этого чё-то стрираются
#pragma hdrstop
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
void main(){
float Rn=0, Rd=0, Sn=0;
float Intersection_AB=0.0, Intersection_CD=0.0, Intersection_X=0.0, Intersection_Y=0.0;
int t;
//cout<<"\n‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® вҐбв®ў "; //(DOS)
cout<<"\n Введите количество тестов "; //(WIN)
cin>>t;
cout<<"\n";
//Динамически создаём массивы
float *Ax = new float[t]; float *Ay = new float[t];
float *Bx = new float[t]; float *By = new float[t];
float *Cx = new float[t]; float *Cy = new float[t];
float *Dx = new float[t]; float *Dy = new float[t];
float *IntersectionX = new float[t];
float *IntersectionY = new float[t];
int i;
for (i=0;i<t;i++){ //ввод в массивы значения
cin>>Ax[i]; cin>>Ay[i]; cin>>Bx[i]; cin>>By[i];
cin>>Cx[i]; cin>>Cy[i]; cin>>x[i];cin>>y[i];
cout<<"\n";
}
for (i=0;i<t;i++){ //цикл для создания массива решений
Rn = (Ay[i]-Cy[i]*(Dx[i]-Cx[i]-(Ax[i]-Cx[i]*(Dy[i]-Cy[i];
Rd = (Bx[i]-Ax[i]*(Dy[i]-Cy[i]-(By[i]-Ay[i]*(Dx[i]-Cx[i];
if (Rd == 0){
//Криво присваиваю???
IntersectionX[i] = -9999.0;
IntersectionY[i] = -9999.0;
}else{
Sn = (Ay[i]-Cy[i]*(Bx[i]-Ax[i] - (Ax[i]-Cx[i]*(By[i]-Ay[i];
Intersection_AB = Rn/Rd;
Intersection_CD = Sn/Rd;
//Криво присваиваю???
IntersectionX[i] = Ax[i]+Intersection_AB*(Bx[i]-Ax[i];
IntersectionY[i] = Ay[i]+Intersection_AB*(By[i]-Ay[i];
}
}
cout<<"\n";
for (i=0;i<t;i++){ //вывод всех решений на экран
//Или здесь криво читаю???
cout<<"\n"<<IntersectionX[i]<<" "<<IntersectionY[i];
}
// Освобождение памяти
delete []Ax; delete []Ay;
delete []Bx; delete []By;
delete []Cx; delete []Cy;
delete []x; delete []y;
cin.get();cin.get();
}
Номер ответа: 19
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #19
Добавлено: 08.10.05 19:22
Sharp
Мне очень понравился анализ 3 задачи. Свести к последовательности Фиббоначчи- класс!
Если не секрет, ты просто сел и сделал или был прежний опыт?
Номер ответа: 20
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #20
Добавлено: 08.10.05 19:42
а я чё-то не чё не понял, вы извиняйте если я гоню беса, просто вторые сутки прокатически не сплю, меня слегка косит уже... так что особо не придерайтесь к коду и к моим постам
Номер ответа: 21
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #21
Добавлено: 08.10.05 20:22
Что ты имеешь в виду под данными которые были в IntersectionX и IntersectionY раньше?
У меня твой пример нормально работает???
Номер ответа: 22
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #22
Добавлено: 08.10.05 20:38
Последовательность Фиббоначчи это числовой ряд, где последующий член равен сумме двух предыдущих.
На нашем примере.
1 2 3 5 8. и т. д.
То есть для задачи 3, чтобы узнать кол - во суперчисел достаточно вычислить n+1 член ряда.
Допустим у нас длина числа 3 - тогда колво суперчисел равно 5 (2+3) или п+1 член.(n=3)
Если тебе нужно посчитать количество суперчисел при длине 10 то тебе нужно вычислить 11 член ряда, а посчитать его как ты видишь очень просто.
И этот алгоритм будет работать очень быстро.
Номер ответа: 23
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #23
Добавлено: 08.10.05 21:10
#1 Готво, ура, если кому интерестно...
/*
ИБ-05-1 Бычихин Руслан
Задача: На плоскости задано два отрезка. Необходимо найти точку их пересечения.
Выходные данные: Для каждого теста в отдельной строке через пробел выведите
координаты точки пересечения с точностью три цифры после десятичной точки.
Если отрезки не пересекаются или пересекаются в более чем одной точке выведите знак '-'.
*/
#include <iostream.h>
#include "stdio.h"
#include "windows.h"
bool IsLinesCross(_int64 x11, _int64 y11, _int64 x12, _int64 y12, _int64 x21, _int64 y21, _int64 x22, _int64 y22);
void main(){
float Rn=0, Rd=0, Sn=0;
float Intersection_AB=0.0, Intersection_CD=0.0, Intersection_X=0.0, Intersection_Y=0.0;
int t, i;
cout<<"\n Enter count test ";
cin>>t; cout<<"\n";
//Динамически создаём массивы
float *Ax = new float[t]; float *Ay = new float[t];
float *Bx = new float[t]; float *By = new float[t];
float *Cx = new float[t]; float *Cy = new float[t];
float *Dx = new float[t]; float *Dy = new float[t];
float *IntersectionX = new float[t]; //Результаты
float *IntersectionY = new float[t];
for (i=0;i<t;i++){ //ввод в массивы значения
cin>>Ax[i]; cin>>Ay[i]; cin>>Bx[i]; cin>>By[i];
cin>>Cx[i]; cin>>Cy[i]; cin>>x[i];cin>>y[i];
cout<<"\n";
}
cout<<"\n";
for (i=0;i<t;i++){ //цикл для создания массива решений
if(IsLinesCross(Ax[i],Ay[i],Bx[i],By[i],Cx[i],Cy[i],Dx[i],Dy[i]){
//если пересекаются, то высчитываем где именно
Rn = (Ay[i]-Cy[i]*(Dx[i]-Cx[i]-(Ax[i]-Cx[i]*(Dy[i]-Cy[i];
Rd = (Bx[i]-Ax[i]*(Dy[i]-Cy[i]-(By[i]-Ay[i]*(Dx[i]-Cx[i];
Sn = (Ay[i]-Cy[i]*(Bx[i]-Ax[i] - (Ax[i]-Cx[i]*(By[i]-Ay[i];
Intersection_AB = Rn/Rd;
Intersection_CD = Sn/Rd;
IntersectionX[i] = Ax[i]+Intersection_AB*(Bx[i]-Ax[i];
IntersectionY[i] = Ay[i]+Intersection_AB*(By[i]-Ay[i];
}else{
IntersectionX[i] = -9999;
IntersectionY[i] = -9999;
}
}
cout<<"\n";
for (i=0;i<t;i++){ //вывод всех решений на экран
if ((IntersectionX[i] == -9999) && (IntersectionY[i] == -9999)){
cout<<"\n-";
}else{
cout<<"\n"<<IntersectionX[i]<<" "<<IntersectionY[i];
}
}
// Освобождение памяти
delete []Ax; delete []Ay;
delete []Bx; delete []By;
delete []Cx; delete []Cy;
delete []x; delete []y;
delete []IntersectionX; delete []IntersectionY;
cin.get();cin.get();
}
bool IsLinesCross(_int64 x11, _int64 y11, _int64 x12, _int64 y12, _int64 x21, _int64 y21, _int64 x22, _int64 y22){
//ф-ця для проверки пересечения линий
_int64 maxx1 = max(x11, x12), maxy1 = max(y11, y12);
_int64 minx1 = min(x11, x12), miny1 = min(y11, y12);
_int64 maxx2 = max(x21, x22), maxy2 = max(y21, y22);
_int64 minx2 = min(x21, x22), miny2 = min(y21, y22);
if (minx1 > maxx2 || maxx1 < minx2 || miny1 > maxy2 || maxy1 < miny2)
return FALSE;
_int64 dx1 = x12-x11, dy1 = y12-y11;
_int64 dx2 = x22-x21, dy2 = y22-y21;
_int64 dxx = x11-x21, dyy = y11-y21;
_int64 div, mul;
if ((div = (_int64)((double)dy2*dx1-(double)dx2*dy1)) == 0)
return FALSE;
if (div > 0) {
if ((mul = (_int64)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul > div)
return FALSE;
if ((mul = (_int64)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul > div)
return FALSE;
}
if ((mul = -(_int64)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul > -div)
return FALSE;
if ((mul = -(_int64)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul > -div)
return FALSE;
return TRUE;
}
RESPECT за помощь по этому заданию, el-paso и DaSharm.
Номер ответа: 24
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #24
Добавлено: 08.10.05 22:14
Просто сел и сделал, числа 5 и 8 меня сразу на подозрения натолкнули
Номер ответа: 25
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #25
Добавлено: 09.10.05 00:47
HACKER
Давай дальше!
Sharp
Еще раз удивляеся возможностям этой последовательности. Она описывает очень многие закономерности(а может и все?). Действительно какой - то магический(может потому - что до конца не понятый?) закон.
Но ты этим пользуешься свобдно)
Номер ответа: 26
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #26
Добавлено: 09.10.05 17:50
Как на Си, узнать размер динамического массива, ну типа влом счётчик держать при добавлении нового эл. в массив... как типа в басика Ubound
Номер ответа: 27
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #27
Добавлено: 09.10.05 18:38
Счетчик держать обязательно, иначе секирбашка и гпф (даже не знаю, что страшнее). Последовательность Фиббоначчи рулит, не так давно я узнал о ее хитрой связи с треугольником Паскаля.
Номер ответа: 28
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #28
Добавлено: 09.10.05 21:38
блин, та неужели мощь Си + ассемовские вставки, немогут решить вопрос с динамическими массивами?
Номер ответа: 29
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #29
Добавлено: 09.10.05 23:13
ой, по поводу моей реализации первой задачи, там местами надо кое чё поменять, короче при вводе заменить надо
cin>>Ax[i]; cin>>Ay[i]; cin>>Bx[i]; cin>>By[i];
Номер ответа: 30
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #30
Добавлено: 10.10.05 00:37
HACKER
Конечно решили. Но тебе придется использовать класс vector из stl( стандартная библиотека языка С++)
Этот класс поддерживает много полезных функций. Но с ним придется немного разобраться.(можно рассматривать его как ответ на твой вопрос и еще многие вопросы пазработчиков на С++, то есть такая нужда возникла давно).
Используй если это разрещено правилами олимпиады.
А с обычным,как и сказал Sharp, массивом работать только таким образом, вручную.
Ты не удивляйся, это определенная низкоуровневая специфика, или рассматривай это как плату за возможности и скорость работы программы.