Suma ciągu SPOJ

0

Witam, mam pewien problem z zadankiem ze SPOJA. Chodzi konkretnie o http://pl.spoj.com/problems/KC024/
Napisałem kod, dla wszystkich testów z forum spoja + moich własnych działa, mimo to cały czas dostaje WA. Może źle rozpatrzyłem skrajne przypadki?

 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int liczba=0,ilosc=0,wysokosc=0,suma=0, liczba2=0, element=0, j;
vector <int> v;

int check(int x, int liczba2)
{
    if(x==-1) return 0;
    if(v[x]<=liczba2)
    {
        liczba2 -= v[x];
        if(liczba2==0) return 1;
        check(x-1,liczba2);
    }
        else check(x-1,liczba2);
}

void ciag()
{
   ios_base::sync_with_stdio(0);
        cin >> liczba;
        cin >> ilosc;
        for(j=0; j<ilosc; j++)
        {
        cin >> wysokosc;
                if(wysokosc<liczba) { v.push_back(wysokosc); suma += wysokosc; element++;}
                if(wysokosc==liczba) {suma=liczba; break;}
         }
if(ilosc==0) cout << 0;
else
if(suma<liczba)   cout <<  0;
    else if (suma==liczba)   cout <<  1;
else
{
liczba2=liczba;
sort(v.begin(), v.end());
    for(j=element-1; j>=0; j--)
    {
        if(j==0) { cout << 0; break; }
                if(check(j,liczba2)==1) { cout << 1; break; }
    }
}
}
int main()
{
    ciag();
}

przykładowe działanie programu:
In:
21 6 13 6 14 10 2 4

1.sortuje elementy: 14 13 10 6 4 2

2.wykonuje odejmowanie (funkcja o nazwie check) 21-14=7, 7-1=1 <-- nie dostałem 0 więc sprawdzam kolejna liczbe ( i tak do końca wektora) :
21-13=8, 8-6=2, 2-2=0 <-- dostałem 0, wypisuje 1, kończe program.

Dla przypadku, który w żadnym wywołaniu funkcji check nie zwróci mi 0, wypisuje 0 i kończe program.

Proszę o pomoc, bo nie wiem gdzie jest błąd, może o czym zapomniałem?
pozdrawiam

0
bool ciag()
{
        if(!(cin >> liczba)) return false;
        ...
  return true;
}

int main()
  {
   ios_base::sync_with_stdio(0);
   while(ciag()) cout<<endl;
   return 0;
  }
0

Nie do końca rozumiem na czym polega ta modyfikacja. W treści zadania jest napisane, że "Na wejście programu podana zostanie pewna liczba trzyczęściowych zestawów danych". To jak ma wygląda w końcu to wejście? I czy dobrze są rozpatrzone skrajne przypadki? tj. dla np. in: 0 1 1 out:1 i in: 0 0 out:0 ?

0

Pewna liczba oznacza od 1 do nie wiadomo ile.
U ciebie jest obsługiwany tylko i wyłacznie jeden zestaw.

0

Nigdzie nie sprawdzasz czy dane się czasem juz nie skończyły! Nawet jak sie skończą to twój program nadal będzie "czekał" na dane. Warunek podany przez @_13th_Dragon sprawdza tylko czy odczyt pierwszej zmiennej się powiódł - jeśli nie to koniec programu.

0

Tak to ma wyglądać? Rozumiem o co chodzi, w czym jest błąd, tylko gorzej z zapisem.

 #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int liczba,ilosc,wysokosc,suma, liczba2, element, j;
vector <int> v;

int check(int x, int liczba2)
{
    if(x==-1) return 0;
    if(v[x]<=liczba2)
    {
        liczba2 -= v[x];
        if(liczba2==0) return 1;
        check(x-1,liczba2);
    }
        else check(x-1,liczba2);
}

bool ciag()
{
    liczba=0; ilosc=0; wysokosc=0; suma=0; liczba2=0; element=0;
    if(!(cin >> liczba)) return false;
    cin >> ilosc;
        for(j=0; j<ilosc; j++)
        {
        cin >> wysokosc;
                if(wysokosc<liczba) { v.push_back(wysokosc); suma += wysokosc; element++;}
                if(wysokosc==liczba) {suma=liczba; break;}
         }
if(ilosc==0)  return false;
else
if(suma<liczba)  return false;
    else if (suma==liczba)   return true;
else
{
sort(v.begin(), v.end());
    for(j=element-1; j>=0; j--)
    {
      liczba2=liczba;
        if(j==0) return false;
                if(check(j,liczba2)==1)  return true;
    }
}
}
int main()
{
    while(cout << ciag()) cout<<endl;
    return 0;
}
0

z treści wyraźnie widać, że program ma zawsze przetworzyć trzy zestawy danych.
w pierwszym kodzie przetwarzasz tylko jeden - wywołaj ciag() 3 razy.

treść zadania nie precyzuje ile jest zestawów danych, jest ich dużo i nawet nie muszą być obdzielone znakiem końca linii.
Zaliczyłem zadanie stosując wczytywanie z kodu poniżej.

0

@_13th_Dragon widzę, że jest AC na spoju więc prosze o wskazówki!:)

0

Zerknie ktoś na wyjście #11? http://ideone.com/s2pdAd
Czemu wczytuje tak nie po kolei ?

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

using namespace std;

typedef vector<int> Liczby;

bool czytajDane(istream &in, int &suma, Liczby &a){
    int ileLiczb,x;
    if (in >> suma >> ileLiczb) {
        a.clear();
        a.reserve(ileLiczb);
        for (int i=0;i<ileLiczb; ++i)
            if (in >> x)
                a.push_back(x);
        sort(a.begin(), a.end(), greater<int>());
        return true;
    }
    return false;
}

bool testSumy(int suma, Liczby::iterator poczatek, Liczby::iterator koniec) {
    ...
}

int main()
{
    ios_base::sync_with_stdio(false);

    int suma;
    vector<int> a;
    while(czytajDane(cin, suma, a)) {
        cout << (testSumy(suma, a.begin(), a.end())?"1":"0") << endl;
    }
    return 0;
}
0

@MarekR22 , a jakiego algorytmu użyłeś w testSumy? bo ja dostaje teraz Wrong Answer

stanęło na czymś takim:

 #include <iostream>
#include <vector>
using namespace std;
int liczba=0,ilosc=0,wysokosc=0,suma=0, liczba2=0, element=0, j=0;
bool b;
vector <int> v;
int check(int x, int liczba2)
{
    if(x==-1) return 0;
    if(v[x]<=liczba2)
    {
        liczba2 -= v[x];
        if(liczba2==0) return 1;
        check(x-1,liczba2);
    }
        else check(x-1,liczba2);
}
main()
{
    ios_base::sync_with_stdio(0);
while(cin >> liczba)
{
cin >> ilosc;
    if(liczba>0 && ilosc==0) b=false;
    else
        if(liczba==0 && ilosc==0) b=true;
        else
{
        for(j=0; j<ilosc; j++)
        {
        cin >> wysokosc;
                if(wysokosc<=liczba) { v.push_back(wysokosc);  suma += wysokosc; element++;}
         }
    if(suma==liczba) b=true;
        else
    if(suma<liczba) b=false;
else
    {
        for(j=element-1; j>=0; j--)
        {
            liczba2=liczba;
            if(j==0) { b=false; break; }
                    if(check(j,liczba2)==1) { b=true; break; }
        }
    }
}
cout  << b ;
cout <<endl;
suma=0;
}
return 0;
}

gdzie robie błąd?

0

Największy błąd który robisz to brak formatowania, przez co po pierwsze sam nie widzisz gdzie popełniłeś błąd a po drugie innym się nie chcę w tym bajzlu grzebać.

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