Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 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-сайт: sharpc.livejournal.com
 Профиль | | #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>>;Dx[i];cin>>;Dy[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 [];Dx; delete [];Dy;

cin.get();cin.get();
}

Ответить

Номер ответа: 19
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: softvito.narod2.ru
 Профиль | | #21
Добавлено: 08.10.05 20:22
Дело в том что при присваивании массвам IntersectionX и IntersectionY все данные что были в нём до этого чё-то стрираются :)


Что ты имеешь в виду под данными которые были в IntersectionX и IntersectionY раньше?

У меня твой пример нормально работает???

Ответить

Номер ответа: 22
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #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>>;Dx[i];cin>>;Dy[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 [];Dx; delete [];Dy;
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-сайт: sharpc.livejournal.com
 Профиль | | #24
Добавлено: 08.10.05 22:14
Просто сел и сделал, числа 5 и 8 меня сразу на подозрения натолкнули :)

Ответить

Номер ответа: 25
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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>>Cx[i]; cin>>Cy[i]; cin>>;Dx[i]; cin>>;Dy[i];
cin>>Ax[i]; cin>>Ay[i]; cin>>Bx[i]; cin>>By[i];

Ответить

Номер ответа: 30
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #30
Добавлено: 10.10.05 00:37
HACKER

Конечно решили. Но тебе придется использовать класс vector из stl( стандартная библиотека языка С++)
Этот класс поддерживает много полезных функций. Но с ним придется немного разобраться.(можно рассматривать его как ответ на твой вопрос и еще многие вопросы пазработчиков на С++, то есть такая нужда возникла давно).
Используй если это разрещено правилами олимпиады.

А с обычным,как и сказал Sharp, массивом работать только таким образом, вручную.

Ты не удивляйся, это определенная низкоуровневая специфика, или рассматривай это как плату за возможности и скорость работы программы.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам