Advertisement
allia

элемент больше соседей

Oct 13th, 2020 (edited)
2,340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. int vvod (int x)
  7. {
  8.   cout.flush();
  9.   int y;
  10.   cout << "?" << " " << x << endl;
  11.   cin >> y;
  12.   return y;
  13. }
  14.  
  15. int bin (int razmer, int left, int right, int &result)
  16. {
  17.  int i = 0;
  18.  int middle;
  19.  int pred_middle;
  20.  int past_middle;
  21.  
  22.   i = (left + right) / 2;
  23.   middle = vvod (i);
  24.   pred_middle = vvod (i-1);
  25.  
  26.   if (right - left >= 2)
  27.    {
  28.        if (pred_middle > middle)
  29.       {
  30.        right = i;
  31.        bin (razmer, left, right, result);
  32.       }
  33.        else if (pred_middle == middle)
  34.        {
  35.          right = i-1;
  36.         bin (razmer, left, right, result);
  37.        }
  38.      else
  39.        {
  40.         past_middle = vvod(i+1);
  41.          if (past_middle > middle)
  42.           {
  43.            left = i;
  44.            bin (razmer, left, right, result);
  45.           }
  46.            else if (past_middle == middle)
  47.              {
  48.               left = i+1;
  49.               bin (razmer, left, right, result);
  50.              }
  51.              else
  52.              {
  53.                result = i;
  54.              }
  55.              
  56.      }
  57.    }
  58.  
  59. return result;
  60. }
  61.  int poisk (int razmer)
  62.  {
  63.    int result = -1;
  64.    int middle;
  65.    int pred_middle;
  66.    int past_middle;
  67.    int shet_1 = 0, shet_2 = 0;
  68.  
  69.   int i = (razmer+1) / 2;
  70.   middle = vvod (i);
  71.   pred_middle = vvod (i-1);
  72.  
  73.   if (pred_middle > middle)
  74.       {
  75.        bin (razmer, 1, i, result);
  76.        shet_1++;
  77.       }
  78.        else if (pred_middle == middle)
  79.        {
  80.         bin (razmer, 1, i-1, result);
  81.         shet_1++;
  82.        }
  83.      else
  84.        {
  85.         past_middle = vvod(i+1);
  86.          if (past_middle > middle)
  87.           {
  88.            bin (razmer, i, razmer, result);
  89.            shet_2++;
  90.           }
  91.            else if (past_middle == middle)
  92.              {
  93.               bin (razmer, i+1, razmer, result);
  94.               shet_2++;
  95.              }
  96.              else
  97.              result = i;
  98.        }
  99.  
  100.   if (result == -1 && shet_1 != 0)
  101.     bin (razmer, i+1, razmer, result);
  102.   else if (result == -1 && shet_2 != 0)
  103.     bin (razmer, 1, i-1, result);
  104.  
  105.   return result;
  106.  }
  107.  
  108. int main()
  109. {
  110.   cout.flush();
  111.   long long n;
  112.   cin >> n;
  113.  
  114.   int first_elem = 0, second_elem = 0, last_elem = 0, pred_last_elem = 0, index = 0;
  115.  
  116.   first_elem = vvod(1);
  117.   second_elem = vvod(2);
  118.  
  119.   last_elem = vvod(n);
  120.   pred_last_elem = vvod(n-1);
  121.  
  122.   if (last_elem > pred_last_elem)
  123.     index = n;
  124.     else if (first_elem > second_elem)
  125.      index = 1;
  126.       else index = poisk(n);
  127.  
  128.   cout << "! " << index << endl;
  129.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement