Wyszukiwanie binarne

0

Witam!
Mam taki problem:
rozwiązuje sobie zadanko. Dobrym sposobem rozwiązania byłoby, dla liczby a, wyszukanie w tablicy pierwszego elementu którego wartość >=a i zwrócenie jego indeksu. Czy da się jakoś przerobić binary search z stla, aby dawało taki wynik?

0

Dokładnie, to chodzi o przerobienie lower_bound.

0

czemu nie zastosować:
find_if ?

0

Mam takie zadanko:
http://skin.radom.pl/SHowFile.aspx/tun.pdf?taskid=ded9c070-5536-4946-927f-0d3e83749a8f&cday=702c7c4f-5b80-45d3-b902-ded50b52ef9b&filename=tun.pdf

Mój kod:

#include <iostream>

using namespace std;

int tunele[500000];
int samochody[500000];

bool funkcja(int i)
{
    return (i < tunele[i]);
}

int main()
{
    ios_base::sync_with_stdio(0);
    int a, b;
    cin >> a >> b;
    for(int i=0; i<a; i++)
        cin >> tunele[i];
    for(int i=0; i<b; i++)
        cin >> samochody[i];
    for(int i=0; i<b; i++)
    {
        int x = find_if(tunele, tunele+a, funkcja());
        cout << *x << " "
    }
    return 0;
}
 

W 9 linijce kompilator mówi error: too few arguments to function `bool funkcja(int)'.

Jak to można zrobić?

0

Lepiej to zrobić przez functional:

#include <cstdlib>
#include <iostream>
using namespace std;
 
struct funkcional
  {
   int a;
   funkcional(int a):a(a) {}
   bool operator()(int i) { return i>a; }
  };
 
int tunele[500000];
int samochody[500000];

int main()
  {
   int a,b;
   cin>>a>>b;
   for(int i=0;i<a;++i) cin>>tunele[i];
   for(int i=0;i<b;++i) cin>>samochody[i];
   for(int i=0;i<b;++i)
    {
     //szukamy w tunele wartość większą od samochody[i]
     int *x=find_if(tunele,tunele+a,funkcional(samochody[i]));
     if(x>=tunele+a) cout<<"brak"<<endl;
     else
       {
        cout<<"wartosc: "<<*x<<endl;
        cout<<"indeks: "<<(x-tunele)<<endl;
       }
    }
   cin.sync(); cin.get();
   return 0;
  }

Z funkcją jedynie przez zmienną globalną co jest beznadziejnym rozwiązaniem:

#include <cstdlib>
#include <iostream>
using namespace std;
 
int szukamy;
bool funkcja(int i)
  {
   return i>szukamy;
  };
 
int tunele[500000];
int samochody[500000];

int main()
  {
   int a,b;
   cin>>a>>b;
   for(int i=0;i<a;++i) cin>>tunele[i];
   for(int i=0;i<b;++i) cin>>samochody[i];
   for(int i=0;i<b;++i)
    {
     //szukamy w tunele wartość większą od samochody[i]
     szukamy=samochody[i];
     int *x=find_if(tunele,tunele+a,funkcja);
     if(x>=tunele+a) cout<<"brak"<<endl;
     else
       {
        cout<<"wartosc: "<<*x<<endl;
        cout<<"indeks: "<<(x-tunele)<<endl;
       }
    }
   cin.sync(); cin.get();
   return 0;
  }
0

Ok, dzięki za odp. Mógłbyś wyjaśnić tę strukturę?

 struct funkcional
  {
   int a;
   funkcional(int a):a(a) {} // co tu jest? Jakiś konstruktor? Tylko czemu jest :a(a)?
   bool operator()(int i) { return i>a; } // jaki to właściwie operator? operator ()?
  };

1 użytkowników online, w tym zalogowanych: 0, gości: 1