2015-06-21 4 views
0

У меня есть два номера P и K. У меня есть массив A из N integers.I хочу найти наименьшее число A[i], который просто удовлетворяет свойства abs(A[i]-P) <= K где 0 <= i < N. Показано, что A сортируется.Найдите номер, который удовлетворяет ограничениям

Первоначально, я думал о O(N) подхода. Но я думаю, что его можно оптимизировать до O(logN), используя двоичный поиск. Но я не знаю, как двигаться дальше.

+3

Это постоянное соревнование по программированию: https://www.hackerrank.com/contests/epiccode/challenges/dance-in-pairs –

+0

О, извините, я не знал об этом факте. Я проясню свои сомнения после того, как конкурс наступит . Мое сомнение в том, что со ссылкой на этот вопрос «https://www.hackerrank.com/contests/infinitum-jul14/challenges/sherlock-and-probability» – user3186829

+0

есть редактор для этой задачи. Вы можете просто прочитать его, и я очень сомневаюсь, что кто-то здесь напишет ответ более подробно, чем он написан в редакционной статье. –

ответ

1

Используйте это:

for(i=0; i<=n; i++)pre[i]=0; 
    for(i=1; i<=n; i++) 
    { 
      pre[i]=pre[i-1]; 
      if(s[i-1]=='1')pre[i]++; 
    } 
    for(i=1; i<=n; i++) 
    { 
      if(s[i-1]=='0')continue; 
      ans += pre[min(n,i+k)]-pre[max(0ll,i-k-1)]; 
    } 
    LL gc=gcd(ans,n*n); 
    cout << ans/gc << "/" << (n*n)/gc << endl; 
1

Try следующая логика:

  • Найти минимальный номер индекс, который >= abs(P-K) с помощью двоичного поиска, если не найден идти дальше,
  • Найти минимальный индекс номер, который <= (P+K) используя двоичный поиск, если не найден, то такого числа нет.

Это O(log(n)) думаю.

Смежные вопросы