1. C++ / Говнокод #13892

    +77

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    #include <iostream>
    using namespace std;
    
    int binsearch(int* arr, int s, int r, int l, int t){
        int m=(l+r)/2;
        if (*(arr+m) == s) return m; // t - искомое
        if (m == l || m == r) return 0;
        if (*(arr+m) < s) binsearch(arr, s, m, r, t);
        else binsearch(arr, s, l, m, t);
        }
    
    int main()
    {
        int n, k;
        cin >> k;
        cin >> n;
        int A[n-1];
        for (int i = 0; i < n; i++){
            cin >> A[i];
        }
        cout << binsearch(A, k, n-1, 0, 0);
    }

    Требуется найти число K в упорядоченном массиве из N элементов и
    определить чему равен номер соответствующего элемента массива.
    Если элемент не найден, то вывести 0.

    Входные данные
    В первой строке расположено искомое число К.
    Во второй - количество элементов в массиве N <= 10000.
    Далее расположены N целых чисел, упорядоченных по возрастанию.

    Выходные данные
    Выведите наименьший номер найденного значения, или 0, если элемент не найден.

    Проблема у меня в том, что не получается найти минимальный из подходящих ( Помогите пофиксить!

    Запостил: aesc_smirnov, 03 Октября 2013

    Комментарии (31) RSS

    • int s, int r, int l, int t
      
      int n, k;

      Ё п. П, н п з и. Н х ж н п, б. Н и в, л з н л.
      Ответить
    • Да откуда вы все лезете со своим двоичным поиском...

      http://govnokod.ru/13868
      http://govnokod.ru/13852
      Ответить
      • Рассказать? Или ссылку кинуть? :D
        Ответить
        • Рассказывай ;)
          Ответить
          • При естественном половом акте сперма мужчины попадает во влагалище женщины.Среда влагалища является губительной для сперматозоидов в силу повышенной кислотности (pH около 4). Спустя два часа после эякуляции...
            ЧИТАТЬ ДАЛЕЕ >>>
            Ответить
        • Я кажется пофиксил, не знаю)

          #include <iostream>
          using namespace std;

          int binsearch(int* arr, int s, int r, int l){
          int m=(l+r)/2;
          if (*(arr+m) == s) return m; // t - искомое
          if (m == l || m == r) return 0;
          if (*(arr+m) < s) binsearch(arr, s, m, r);
          else binsearch(arr, s, l, m);
          }

          int main()
          {
          int n, k, res;
          cin >> k;
          cin >> n;
          int A[n-1];
          for (int i = 0; i < n; i++){
          cin >> A[i];
          }
          res = binsearch(A, k, n-1, 0);
          if (res != 0){
          for(int j = 1; ; j++){
          if(A[res-j] == A[res]) res -= j;
          else break;
          }
          } cout << res;
          }
          Ответить
          • > *(arr+m)
            Вот нахер так писать, а? Можно же просто arr[m].

            > int A[n-1];
            Опять двадцать пять... Вы че там всей группой одну лабу копипастите? У двух людей абсолютно одинаковый косяк...
            Ответить
            • указатель меньше места занимает, массив у меня большой.
              а что вам не нравится в объяве массива?
              Ответить
              • > меньше места занимает,
                Для указателей, внезапно, тоже работают скобки. В данном случае записи *(arr+m) и arr[m] были бы эквивалентны. Скачай какую-нибудь хорошую книжку по си...

                > а что вам не нравится в объяве массива?
                То что он на один элемент меньше чем надо ;)
                Ответить
            • #include <iostream>
              using namespace std;

              int binsearch(int* arr, int s, int r, int l){
              int m=(l+r)/2;
              if (arr[m] == s) return m; // t - искомое
              if (m == l || m == r) return 0;
              if (arr[m] < s) binsearch(arr, s, m, r);
              else binsearch(arr, s, l, m);
              }

              int main()
              {
              int n, k, res;
              cin >> k;
              cin >> n;
              int A[n-1];
              for (int i = 0; i < n; i++){
              cin >> A[i];
              }
              res = binsearch(A, k, n-1, 0);
              if (res != 0){
              for(int j = 1; ; j++){
              if(A[res-j] == A[res]) res -= j;
              else break;
              }
              } cout << res;
              }

              Помогите пожалуйста, не пойму в чем фигня?
              Ответить
    • Ещё в прошлый раз хотел запостить, учитывая что требования писать велосипеды в задании нет:
      #include <algorithm>
      #include <iostream>
      #include <vector>
      
      
      int main()
      {
          int amount, value;
          std::cin >> value >> amount;
          std::vector<int> data(amount); //int — примитивный тип и никакого оверхеда
                                         //на создание вектора из n элементов нет
          for (int& i: data) //Простой способ.
              std::cin >> i; //Можно было использовать reserve+push_back
                             //или back_inserter
          auto found = std::lower_bound(data.cbegin(), data.cend(), value);
          if (found == data.cend() || *found != value)
              std::cout << 0 << std::endl;
          else
              std::cout << ( std::distance(data.cbegin(), found) + 1 ) << std::endl;
          return 0;
      }
      Ответить
      • Заодно научится включать с++11 в своем компиляторе :)
        Ответить
        • Спасибо, но я справился сам) а насчет кода, вы правы, буду учиться.
          Ответить
      • iomanip в с++11 больше не надо включать?
        Ответить
        • А нахрена тут <iomanip>? Он и в с++98 не нужен, ибо std::endl где-то в районе ostream объявлен.

          http://www.cplusplus.com/reference/iomanip/
          Ответить
    • Что за `else binsearch' без return?
      Ответить
      • > Что за `else binsearch' без return?
        Подозрительное сходство с http://govnokod.ru/13852... говно таится в одних и тех же местах ;) Я бы въебал им обоим по паре.

        P.S. А крестокомпилятор тролль, не скажет же про отсутствующий return без -Wall ;)
        Ответить
        • > Подозрительное сходство с http://govnokod.ru/13852...
          Само подозрительное это сходство имён и юзерИд у постеров.
          Ответить
          • > Само подозрительное это сходство имён и юзерИд у постеров.
            O_o. Так это один человек... и он до сих пор не научился писать return...
            Ответить
    • В следующий раз иди на киберфорум или скюль.ру. Там такое любят.
      Ответить
    • Если уже нашёл ID какого - то из K, можно после этого применить нечто, вроде
      while (A[FoundID - 1] == K) {
          FoundID--;
      }
      Ответить
      • Не учи студента хуйне :) Там все нормально делается и без этого линейного поиска.

        http://en.cppreference.com/w/cpp/algorithm/lower_bound#Possible_implementation
        Ответить

    Добавить комментарий