Poprawa kodu do zadania

0

Cześć, przygotowując się do OIG postanowiłem rozwiązać zadanie link. Napisałem kod na 72 punkty, jednak nie mogę wyeliminować dwóch błędów, mianowicie:
0 wiersz 1: wczytano '1', a oczekiwano '2'
1a wiersz 1: wczytano '2', a oczekiwano '3'
2 wiersz 1: wczytano '13', a oczekiwano '38'
Proszę o wskazówki/poprawę mojego kodu, jestem dopiero początkującym w C++.
Kod:

#include <bits/stdc++.h>
using namespace std;
   int t[1000007];
   int n,k,wynik,dziewczynki,koniec,poczatek;
int main()
{


    cin >> n >> k;
    for(int i =0;i<n;i++){
        cin >> t[i];}

    poczatek = 1;
    koniec = 1;
    wynik = n + 1;

    if(t[1]==0){
        dziewczynki=1;}
    else{
        dziewczynki=0;}

    while(koniec<n){
        while(dziewczynki<k && poczatek<n){
            poczatek ++;
            if(t[poczatek]==0){
               dziewczynki++;}}
        if(dziewczynki==k){
            wynik=min(wynik,poczatek-koniec+1);}
        if(t[koniec]==0){
            dziewczynki=dziewczynki-1;}
        koniec++;}
    if(wynik ==n+1){
        cout << "NIE";}
    else{
        cout << wynik-k;
    }
    return 0;
}
2

Dlaczego zaczynasz liczyć indeksy poczatek i koniec od 1, a nie od 0; to uprościłoby kod, nie potrzeba by było korekt o 1.
Poza tym nie resetujesz na początku pętli (przed pętlą wewnątrz, która je zmienia) wartości dziewczynki oraz poczatek.
Po modyfikacji działa, ale nie sprawdzałem na szkopule.

0
overcq napisał(a):

Dlaczego zaczynasz liczyć indeksy poczatek i koniec od 1, a nie od 0; to uprościłoby kod, nie potrzeba by było korekt o 1.
Poza tym nie resetujesz na początku pętli (przed pętlą wewnątrz, która je zmienia) wartości dziewczynki oraz poczatek.
Po modyfikacji działa, ale nie sprawdzałem na szkopule.

licząc indeksy od 0 i usuwając niepotrzebne korekty, program działa dla danych przykładowych - dla reszty już nie.

0

niewiele się zmieniło, nie do końca wiem co zrobić dalej

#include <bits/stdc++.h>

using namespace std;
int t[1000007];

int main()
{
    int n,k,wynik,koniec,poczatek;

    cin >> n >> k;
    for(int i =0;i<n;i++){
        cin >> t[i];}
    int dziewczynki = 0;

    if(t[1]==0){
        dziewczynki=1;}
    else{
        dziewczynki=0;}

    poczatek = 0;
    koniec = 0;
    wynik = n + 1;
    while(koniec<n){
        while(dziewczynki<k && poczatek<n){
            poczatek ++;
            if(t[poczatek]==0){
               dziewczynki++;}}
        if(dziewczynki==k){
            wynik=min(wynik,poczatek-koniec);}
        if(t[koniec]==0){
            dziewczynki=dziewczynki-1;}
        koniec++;}
    if(wynik ==n+1){
        cout << "NIE";}
    else{
        cout << wynik-k;
    }
    return 0;
}

0

Po pierwsze daj jakis tytul programu. Po drugie nie wczytuj tak rzeczy

 cin >> n >> k;

tylko tak

cout<<"Podaj cos tam\n"; cin>>n;
cout<<"Podaj drugą rzecz\n";cin>>k;

I z tym masz problem?

Po trzecie to jedno z zadań w których mogą być błędne wyniki przykładowe (w biegach pana bajta jest błąd chyba, że już poprawili)

Po czwarte przed zaczęciem obliczeń przejedź pętlą po wszystkich liczbach czy ilość dziewczynek w tablicy jest wystarczająca, jak nie wyświetl komunikat "do łóżka i do roboty, program czeka!"

"Dla danych wejściowych:

8 3
0 1 1 0 1 0 1 0
poprawną odpowiedzią jest:

2"
Czyli jest 8 osob - 1 chlopiec , 0 dziewczynka

Ile osob usunąć żeby 3 dziewczynki stały obok siebie?

To na pewno 2 chłopców trzeba usunąć czy 3?

Marnujesz czas na te bzdety, w zadaniach regularnie konwertujesz na 0 zeby petle i dane ładnie działały, no raz można, ale więcej?
Jest godzina "W" ale nie ma dnia "0".

Wczytaj sobie plik tekstowy do tablicy, wyszukaj pozycję określonego tekstu w nim, zamień to(tak się ćwiczy pętlę), stwórz jaką minimalną bazę danych, przygotuj jakiś miły interfejs użytkownika, napisz program co po klikaniu na strzałki porusza kwadrat w oknie programu, zdobądź trochę kontroli i przekaż ją dalej, to wtedy Bóg się zacznie uśmiechać do Ciebie.

1
maciek_mw napisał(a):

licząc indeksy od 0 i usuwając niepotrzebne korekty, program działa dla danych przykładowych - dla reszty już nie.

Mamy taki zawodowy żart, który czasem jest prawdą: parzysta ilość błędów

Żle się to czyta. Po pierwsze adresujesz post do tych, co znają zadania maturalne. Reszta nem to du.

Nazwy zmiennych nie są znaczące. Jeszcze takie n ma konwencjonalne znaczenie rozmiaru, ale pozostałe już nie
Część ludzi, kótryz mogli by pomóc, zniechęcasz.

1
johnny_Be_good napisał(a):

Po pierwsze daj jakis tytul programu. Po drugie nie wczytuj tak rzeczy

 cin >> n >> k;

tylko tak

cout<<"Podaj cos tam\n"; cin>>n;
cout<<"Podaj drugą rzecz\n";cin>>k;

NIE! Tutaj format zadania dyktuje, że nie wolno wypisywać nic, co nie jest opisane w zadaniu.

1
    if(t[1]==0){
        dziewczynki=1;}
    else{
        dziewczynki=0;}

t[0] to jest pierwsza komórka.

0
    if(t[1]==0){
        dziewczynki=1;}
    else{
        dziewczynki=0;}

t[0] to jest pierwsza komórka.

Tylko ten fragment jest zbędny, gdy zaczyna liczyć od 0…

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