1 / 26
Jan 2005

In the problem 276-Herdkeeper, how to compute the circumference of the convex hull of a herd in which positions of all antelopes lie in a straight line?

  • created

    Jan '05
  • last reply

    Jun '15
  • 25

    replies

  • 3.1k

    views

  • 19

    users

  • 1

    link

As the infimum of the lengths of all possible closed simple curves surrounding the sheep smile.
In other words: 2 * the distance between the furthest sheep.

4 years later

Wejście:
    11 8 2 -1 0
6 33 -9 10 0
0
Wyjście:
    20
40
0     <---- to jest te zero
60

program nadal dostaje WA, nawet bez tego zera...

Nie wiem dlaczego, ale myślałem że te zero w kończącym dane wejściowe przykładzie kończy każde dane wejściowe i dlatego je wypisywałem. Po kilku poprawkach i dodaniu warunku while(cin>>a) program przeszedł. Dziękuję wszystkim za pomoc smiley

10 months later

Witam. Wydaje mi się, że mam to zadanie rozwiązane poprawnie jednak po każdym zgłoszeniu otrzymuję "błędna odpowiedź" confused Oto kod mojego rozwiązania:

#include <iostream>
using namespace std;
int wskaznik;
long long int liczba,suma=0,suma_sum=0;
int main()
{
    while(cin>>liczba)
         {
             if((liczba==0)&&(wskaznik==0)) 
               {
                   cout<<suma<<endl;
                   cout<<suma_sum<<endl; 
                   break;
               }
             else if((liczba==0)&&(wskaznik!=0))
               {
                   suma_sum+=suma;
                   cout<<suma<<endl;
                   suma=0;
                   wskaznik=0;
               }
             else
               {
                   suma+=liczba;
                   wskaznik++;
               }        
         } 
    cin.ignore();
    getchar();
    return 0;      
}

Próbowałem również wpisywać wyniki do tablicy i wyświetlać wszystko dopiero na końcu, jednak wtedy również program nie był akceptowany.

Był bym wdzięczny, jeśli ktoś dałby mi jakieś wskazówki lub wskazał błąd w moim programie.
Z góry dziękuję za fatygę i pozdrawiam wszystkich spojowiczów wink

Źle zrozumiałeś polecenie (chyba). Masz wypisywać sumy liczb, które kończą się z pojawieniem się zera - to robisz dobrze. Ale sumę sum masz wypisać nie gdy pojawi się linia z samym zerem, tylko po końcu pliku. Tak więc powinieneś wypisać końcową sumę już po while'u, kiedy to nastąpi EOF (End Of File).
Np. mogą być takie testy:

5 -7 8 9 4 6 0
0
-7 -4 -2 0
0
-7 3 -4 2 0

A poprawny output to:

25
0
-13
0
-6
6

No tak... rzeczywiście - źle zrozumiałem polecenie, ponieważ po prostu zasugerowałem się przykładem znajdującym się pod zadaniem i właśnie to on mnie zmylił.

Ale w komentarzach pod zadaniem jest o tym wspomniane - na przyszłość muszę uważniej je czytać wink

Po modyfikacji zadanie zostało zaakceptowane.

Dziękuję bardzo za pomoc Kokosek smile

11 months later

Witam,
Założyłem nowy wątek ponieważ odpowiedzi, które przeczytałem w poprzednich nie pomogły mi w zaliczeniu zadania. Może mój błąd jest innego rodzaju...
W każdym razie prosiłbym o pomoc, ponieważ w kompilatorze c++ program działa mi dobrze. Dlatego tym bardziej nie rozumiem dlaczego dostaję WA.
Poniżej zamieszczam mój kod:
[bbone=CPP,125]
EDIT//100%
[/bbone]

P.S Wiem że można ten program zrobić dużo łatwiej niż z użyciem wektorów. Jednak chciałem się nauczyć tego zagadnienia, dlatego użyłem je w tym zadaniu.

14 days later

zdecydowanie polecam
while(cin>>a)
trzy zmienne na long longach i lata jak trzeba. tablica na longlongach z 99999 elementami zajmuje dużo pamięci, jest tu niepotrzebna i powolna stuck_out_tongue

//twój kod na ideonie: tiny.pl/hwvtv
//kompiluje się, ale daje złe wyniki dla testowych danych
//20
//60
//60
//60
//
//zamiast:
//20
//40
//0
//60

1 year later

Np tak:

while(true)
{
    cin >> liczba;
    if(cin.eof())
    {
        cout << sumawszystkiego;
        return 0;  //koniec programu, albo daj break; jesli masz cos po petli while
    }
    //dalsze instrukcje
}

thun0 identycznie napisałem i wywala zły wynik albo się zawiesza albo dodaje nie wiadomo co. To jest tablica więc jak mam dodać do tej pętli tab?? jeśli tam gdzie mam cin>>liczba dodam [i] to nie będzie działać próbowałem także dodać i++; na końcu ale nic...

-- Śr sty 11, 2012 7:21 pm --

A tak przy okazji przecież zadanie rozwiązałem poprawnie więc dlaczego taki program jak mój nie został uwzględniony w odpowiedziach? działa w 100% i nie rozumiem tego.

break przerywa pętlę ale nie kończy programu
return [w main] to robi
Popatrz jeszcze raz dokładnie co ci podpowiada @thun0 . To zadanie można rozwiązać na wiele sposobów i to co ci podpowiada thuno jest dobrym sposobem, tylko dostosuj się bardziej do tej podpowiedzi, i umieszczaj "dalsze instrukcje " tam gdzie ci podpowiada a nie gdzie ci wydaje się ze mozesz je umieścić.
1. Wczytujesz liczbę
2. sprawdzasz czy to nie koniec pliku [eof]
a) jezeli tak wypisujesz obliczoną do tej pory sumę całkowitą i kończysz program
3. a moze ta liczba to zero [koniec wiersza]? a jezeli tak to robisz pare rzeczy:
a) dodajesz sume wiersza do sumay calkowitej
b) drukujesz sume wiersza i po wydrukowaniu zerujesz ja
c) go to 1 [oczywiscie nie stosuj go to wink]
4. wczytana liczba nie byla zerem dodajemy ja do sumy
5 goto1 [oczywiscie nie goto - tylko to jest koniec twojej petli]


mam nadzieje ze o niczym nie zapomnialem, a o niektórych sprawach [instrukcjach] swiadomie nie pisałem, bo chociaz minimum wysilku, proszę

@up: no racja.
@spy: Nie zastosowałeś tego poprawnie, masz dwie petle while(true), i w drugiej masz warunek z eof() i dajesz break, problem w tym, że zakonczy to wewnetrzna petle, a zewnetrzna sie nie skonczy nigdy. Albo odpowiednio zrobisz warunki w petli i w odpowiednim miejscu dasz cin.eof(), albo zostaw jak jest tylko daj po eofie, wypisanie ostatecznego wyniku i return 0; by zakonczyc program.

PS: Po co masz jeszcze ten warunek ze liczba==0 i suma==0 a po tym break? przeciez wtedy program ci sie zakonczy po linii z jednym zerem co jest błędem.
PS2: Aha to nie ma znaczenia bo nie zerujesz sumy, wiec w ogóle po co to? Musisz to poprawić.

18 days later

Jest jeszcze gorzej.
Aż się zdziwiłem i sprawdziłem na innej przeglądarce, ale tak samo wygląda.

while(...) {
    coś;
}

while(...)
{
    coś;
}

Przykład błędnego:

while(...) {
coś;
}
10 months later

[bbone=cpp,1111]//był tu kod, a teraz go nie ma[/bbone]Przechodzi testy, szukałem też odpowiedzi na forum, ale nie znalazłem nic co by mi pomogło. Proszę o pomoc.

@Edit
Dostaję WA.

15 days later

Być może dlatego, że testujesz podając dane z klawiatury, czy tak?
while(cin >> x) { <-- taka konstrukcja pętli, powoduje, że gdy zostaną wczytane wszystkie dane, pętla "sama" się zakończy, więc warunek if(cin.eof()) { jest całkowicie zbędny, a być może to właśnie on powoduje błąd. Wyrzuć ten warunek, a drukowanie końcowej suma2 przenieś poza pętlę - bezpośrednio przed returnem i zobacz, czy to poprawi i zaliczy ci zadanie.

1 year later
4 months later

Co jest nie tak z tym kodem, bo nie przechodzi.

[bbone=text,1739]
KOD
[/bbone]

O ile dobrze się orientuję (jeśli nie, to niech ktoś mnie poprawi), to w tej wersji kompilatora typy int i long mają po 4 bajty. Zmień typ na większy i będzie AC smile

1 month later

Tak, chodzi o ASCII choć z tego co pamiętam w innych kodowaniach też tak jest, ze znaki alfanumeryczne są po spacji. Interesują nas: spacja, tabulator, znak nowej linii i znak końca pliku, wszystkie mają kody mniejsze/równe spacji (w ASCII 32). Dodatkowe sprawdzenie .eof() jest po to, żeby się zatrzymać funkcję .peek() jeśli napotkano koniec pliku.
Nie do końca rozumiem pytania więc odpowiem dwojako. Do takiego zastosowania jakie chcemy uzyskać nie można napisać:

char ch;
cin>>ch;

bo cin pomija białe znaki i wczyta pierwszy niebiały do zmiennej ch.
Tą instrukcję, która podałem można skrócić tak:

while(cin.peek() <= ' ' && cin) cin.get();

bo jeśli flaga eof zostanie ustawiona to cin przy konwersji na wartość logiczną zwróci false.
Można natomiast, jak najbardziej, tak jak wspomniałem, cały program napisać w oparciu o

long a;
while(cin>>a){
...