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

Themis BINSRCH problem z scanf()

VPS Starter Arubacloud
0 głosów
346 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez Stalowy69 Użytkownik (510 p.)
edycja 11 kwietnia 2018 przez Stalowy69

Cześć wszystkim. Mam do zrobienia zadanie BINSRCH z  https://themis.lo14.wroc.pl

Zadanie udało mi się rozwiązać na wyjściu cout i cin lecz sędzia online w ostatnim teście pokazuje "time limit exceeded". Ograniczenie to 4s wykonania. Powiedziałem sobie no cóż, trzeba wymysleć coś innego i usłyszałem o scanf() i printf() że są szybsze i będzie lepiej. No to ich użyłem lecz teraz problemem jest to że przy wpisywaniu wartości do drugiej tablicy i potem ich odczytaniu.. no kurde są dziwne, jakbym wychodził poza tablicę czy coś, lub przez białe znaki.

-szukałem pomocy u googla z marnym skutkiem.

-próbowałem czyszczenie bufora ale marny skutek, chyba że robiłem to źle (flfush(stdin);)

Czy ktoś jest w stanie mi to wytłumaczyć i pomóc przy tym?

 

EDIT: zrobiłem edit kodu, jest prawie dobrze. Ostatnia wartość na wyniku się nie zgadza.

Np: (najpierw wielksoc tablicy[ENTER] trzy wartosci po spacjach i potem drugi raz to samo ilośc testow i trzy wartosci po spacji. Na końcu wynik.

3

3 3 3

3

1 1 1

wynik: 3 3 2 a powinno być 3 3 3


#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include <stdlib.h>

using namespace std;

int main() {
    
    int i=0, n, N;
    /*
    cin>>n;
    int tabn[n];
    for(int i=0;i<n;i++){
        cin>>tabn[i];
    }
    
    cin>>N;
    int tabN[N];
    for(int i=0;i<N;i++){
        cin>>tabN[i];
    }
    */
    
    
    scanf(" %d",&n);
    unsigned int tabn[n];
    for( int i = 0; i < n; i++ )
    {
        scanf( " %c", & tabn[ i ] );
    }
    
    
  
    scanf(" %d", &N);
    unsigned int tabN[N];
    for( int i = 0; i < N; i++ )
    {
        scanf( " %c", & tabN[ i ] );
    }
    
        
    int tabW[N];
    for(int i=0;i<N;i++){
        int zap=tabN[i];
        int count=0;
            for(int j=0;j<n;j++){
                if(zap<=tabn[j]) count++;
            }
        tabW[i]=count;    
        }
    
    for(int i=0;i<N;i++){
        cout<<tabW[i]<<" ";
        
    }
    
    
    
}

 

komentarz 11 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
A jesteś pewien że to nie jest problem z algorytmem?
komentarz 11 kwietnia 2018 przez Stalowy69 Użytkownik (510 p.)
edycja 11 kwietnia 2018 przez Stalowy69
Robiłem różnorakie testy. Zamieniałem miejscami kolejność wpisywania tablic. Zawsze druga tablica ma złe wartości. podam jej np. 3 3 3 a ona wyswietli 0 1 -123124124.

Raz mi się prawie udało gdy dodałem spacje przy scanf() a dokłądnie w miejscu   " %d"(wcześniej "%d"). Przy wpisaniu wartosci np. 1 1 1 wyswietlało 3 1 1. pierwsza trojka to zapewnie łapie wczesniejszy scanf() tak mi się wydaje czy coś.
komentarz 11 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Jeśli poznam dokładną treść zadania postaram się pomóc. Via prv proszę.
komentarz 11 kwietnia 2018 przez Stalowy69 Użytkownik (510 p.)

Wrzucam publicznie. Może ktoś się znajdzie. Na Cout<<, cin>> program mi działa i sędzia nawet go puszcza ale na ostatnie próbie przekracza 4s i wurzuca "time limit exceeded"

 

1
komentarz 11 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)

1. Wskaż gdzie w swoim kodzie używasz wyszukiwania binarnego? Szukasz liniowo a dane są posortowane więc szybsze będzie wyszukiwanie binarne.

2. Zła alokacja tablicy. W C++ nie używamy VLA.

3. Nawet jeśli używasz nagłówków z C w programie C++, to odpowiednikiem <stdio.h> jest <cstdio>. W tym programie jednak nie będzie potrzebne używanie takiego wejścia.

4. Lepiej użyć std::vector niż walczyć z tablicą i jej usunięciem.

Wczytanie danych do std::vector:

#include <iostream>
#include <vector>
#include <cstddef>

int main() {
    std::size_t n;
    std::cin >> n;
    // Zakładając że int ma 32-bity
    std::vector<unsigned> data;
    data.reserve(n);
    for(std::size_t i = 0; i < n; ++i) {
        std::cin >> data[i];
    }
}

Zgodne z C++03 bo nie wiem jaki kompilator ma sędzia.

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 457 wizyt
pytanie zadane 16 listopada 2018 w C i C++ przez scarlet96 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 313 wizyt
pytanie zadane 9 czerwca 2021 w C i C++ przez warzywko13 Użytkownik (840 p.)
0 głosów
1 odpowiedź 627 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...