• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie wieża problrm

Object Storage Arubacloud
0 głosów
585 wizyt
pytanie zadane 28 lipca 2017 w C i C++ przez Domink Nowicjusz (140 p.)
edycja 28 lipca 2017 przez Arkadiusz Waluk

Witam mam problem z zadanie wieża http://main.edu.pl/pl/archive/ilocamp/2010/wie nie wim jak sie uporać ze powtórzeniami np nie działa dla przykładu 3 1 4 4 4 5 i wypisuje 2 i nie wiem jak to naprawić bo  od razu znajduje ta liczbę i nie wiem jak zrobić żeby sprawdziło jeszcze następne  jeś dziękuje za każdą pomoc:)
 

#include <iostream>
using namespace std;
int tab[1000000],tab2[1000000],to[1000000];
int szukana(int poc,int kon,int x)
{
    int sr;
    while(poc<=kon)
    {
        sr=(poc+kon)/2;
        if(to[sr]<x)
        {
            poc=sr+1;
            x=sr+1;
            return x;

        }
        else
            kon=sr-1;
    }
}

int main ()
{
    ios_base::sync_with_stdio(0);
    int n,m,x;
    cin>>n>>m;
    for(int i=0; i<n; i++)
        cin>>tab[i];
    to[0]=tab[0];
    for(int i=0; i<m; i++)
        cin>>tab2[i];
    for(int i=1; i<n; i++)
        to[i]=max(to[i-1],tab[i]);
    for(int i=0; i<m; i++)
    {

        cout<<szukana(0,n-1,tab2[i])<<" ";

    }
}
komentarz 28 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)

Kod na forum wstawiamy w przeznaczony do tego bloczek, pamiętaj na przyszłość.

1
komentarz 29 lipca 2017 przez vector Dyskutant (9,200 p.)

Użycie std::upper_bound jest przyjemniejsze i prostsze niż pisanie własnej funkcji szukającej. Po co pisać coś, co ktoś napisał dla Ciebie i jest w dodatku w bibliotece standardowej ?

#include <algorithm>
#include <iostream>
#include <vector>

int main(void) {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);

    int height, n, m;
    std::cin >> n >> m;

    std::vector<int> stairs(n);
    std::cin >> stairs[0];
    for(int i = 1; i < stairs.size(); ++i) {
        std::cin >> stairs[i];
        stairs[i] = std::max(stairs[i-1], stairs[i]);
    }

    while(m--) {
        std::cin >> height;
        int index = std::upper_bound(stairs.rbegin(), stairs.rend(), height, std::greater<int>()) - stairs.rbegin();
        std::cout << stairs.size() - index << " ";
    }
    std::cout << std::endl;
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 30 lipca 2017 przez d0n Mądrala (6,440 p.)
edycja 30 lipca 2017 przez d0n
int szukana(int poc,int kon,int x)
{
    int sr;
    while(poc<=kon)
    {
        sr=(poc+kon)/2;
        if(to[sr]<x)
        {
            poc=sr+1;
            x=sr+1;
            return x;
 
        }
        else
            kon=sr-1;
    }
}

Przerywasz wyszukiwanie binarne w miejscu, gdzie powinno być kontynuowane, trzeba przenieść return na koniec funkcji.
Co do upper_bounda i lower_bounda, to przydają się rzadko, jeżeli nie mamy vectora po którym możemy wyszukiwać binarnie to są bezużyteczne (tak się dzieje, gdy np. wyszukujemy po liczbach rzeczywistych). Dobra wiadomość jest taka, że samo wyszukiwanie binarne można napisać w trzech linijkach kodu trochę niekonwencjonalnie:

for ( int c = tab.size(); c >= 1; c /= 2)
	while ( lo + c < tab.size() && tab[lo + c] <= p )
		lo += c;

'tab' w tym przykladzie to twoje 'to', 'p' to 'x', zmienna 'c' reprezentuje coraz mniejsze skoki o ktore probujemy powiekszyc 'lo' - czyli wynik naszego wyszukiwania.

Podobne pytania

0 głosów
2 odpowiedzi 1,620 wizyt
pytanie zadane 28 kwietnia 2015 w C i C++ przez timati Bywalec (2,060 p.)
0 głosów
1 odpowiedź 402 wizyt
0 głosów
2 odpowiedzi 1,425 wizyt
pytanie zadane 12 marca 2016 w C i C++ przez niezalogowany

92,628 zapytań

141,491 odpowiedzi

319,862 komentarzy

62,010 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...