Помогите с олимпиадой

Тема в разделе "WASM.BEGINNERS", создана пользователем REASY, 15 сен 2008.

  1. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    DEEP
    l_inc
    Ваши идею по решению мне понятны на бумаге, но переносом ее на c/cpp тяжел для меня
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    REASY
    Вот честно. Ну не хотелось давать исходник и лишать Вас возможности самому подумать. Но уже ввязался, так что в первый и в последний раз...
    Код (Text):
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. //функция получает косинус угла по координатам вершины (XApex,YApex) и двух точек
    5. double getAngleCos(double XApex,double YApex,double X1,double Y1,double X2,double Y2);
    6.  
    7. //массивы для хранения координат точек
    8. double X[10000],Y[10000];
    9. //массив для хранения номеров передатчиков и счетчик передатчиков
    10. int dotNums[10000],dotNumCntr=0;
    11.  
    12. void main()
    13. {
    14.     //H,W,N - из условия задачи
    15.     //par,par2 - счетчики любых циклов
    16.     //rightestDotNum - номер самого правого передатчика
    17.     //prevDotNum - номер предыдущего найденного передатчика,
    18.     //apexDotNum - номер передатчика, который на данный момент считается вершиной угла
    19.     //newDotNum - номер вновь найденного передатчика
    20.     //buf - промежуточный буфер для сортировки
    21.     int H,W,N,par,par2,rightestDotNum,prevDotNum,apexDotNum,newDotNum,buf;
    22.     double rightestX=0,minimalCos=1,curCos;
    23.  
    24.     //считываем входные данные и попутно находим самый правый объект
    25.     scanf("%d%d%d",&H,&W,&N);
    26.     for (par=0; par<N; par++)
    27.     {
    28.         scanf("%lf%lf",&X[par],&Y[par]);
    29.         if(X[par]>rightestX)
    30.         {
    31.             rightestX = X[par];
    32.             rightestDotNum = par;
    33.         }
    34.     }
    35.     //считаем самый правый передатчик вершиной угла и находим два
    36.     //объекта, которые с ним образуют максимальный угол
    37.     //(косинус этого угла должен быть минимален)
    38.     for (par=0; par<N; par++)
    39.         for (par2=par+1; par2<N; par2++)
    40.             if (par!=rightestDotNum && par2!=rightestDotNum)
    41.             {
    42.                 curCos = getAngleCos(X[rightestDotNum],Y[rightestDotNum],X[par],Y[par],X[par2],Y[par2]);
    43.                 if (curCos<minimalCos)
    44.                 {
    45.                     minimalCos = curCos;
    46.                     newDotNum = par;
    47.                 }
    48.             }
    49.     //циклически находим объекты, образующие максимальный угол с двумя последними найденными
    50.     //до тех пор пока повторно не найдем самый правый передатчик
    51.     dotNums[dotNumCntr++] = rightestDotNum;
    52.     apexDotNum = rightestDotNum;
    53.     do
    54.     {
    55.         minimalCos = 1;
    56.         prevDotNum = apexDotNum;
    57.         apexDotNum = newDotNum;
    58.         dotNums[dotNumCntr++] = newDotNum;
    59.         for (par=0; par<N; par++)
    60.         {
    61.             if (par==prevDotNum || par==apexDotNum) continue;
    62.             curCos = getAngleCos(X[apexDotNum],Y[apexDotNum],X[prevDotNum],Y[prevDotNum],X[par],Y[par]);
    63.             if (curCos<minimalCos)
    64.             {
    65.                 minimalCos = curCos;
    66.                 newDotNum = par;
    67.             }
    68.         }
    69.     } while (newDotNum != rightestDotNum);
    70.     //сортируем номера передатчиков по возрастанию и попутно их выводим
    71.     for (par=0; par<dotNumCntr; par++)
    72.     {
    73.         for (par2=par+1; par2<dotNumCntr; par2++)
    74.             if (dotNums[par]>dotNums[par2])
    75.             {
    76.                 buf=dotNums[par];
    77.                 dotNums[par]=dotNums[par2];
    78.                 dotNums[par2]=buf;
    79.             }
    80.         printf("%d\n",dotNums[par]+1);
    81.     }
    82. }
    83.  
    84. double getAngleCos(double XApex,double YApex,double X1,double Y1,double X2,double Y2)
    85. {
    86.     return ((X1-XApex)*(X2-XApex)+(Y1-YApex)*(Y2-YApex))/(hypot(Y1-YApex,X1-XApex)*hypot(Y2-YApex,X2-XApex));
    87. }
    P.S. Так и не понял, зачем нужны были H и W.
     
  3. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    l_inc
    Спасибо большое,работает.