Zadanie ze SPOJ (log burtowy) - prośba o wytłumaczenie błędu

0

Hej, napisałem oto taki kodzik, wprowadzam dane tak jak w przykładzie i dostaję poprawne wyniki, ale jak zadanie zgłaszam to już jest monit: "błędna odpowiedź", mógłby mi ktoś podpowiedzieć gdzie robię błąd, że zadanie nie przechodzi?
zadanie: http://pl.spoj.com/problems/AL_10_11/

 
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <iomanip>


using namespace std;

// string split
vector<string> split(const string & s, const string & delim, const bool keep_empty = true) {
    vector<string> result;
    
    if(delim.empty()) {
        result.push_back(s);
        return result;    
    }    
    
    string::const_iterator substart = s.begin(), subend;
    while(true) {
        subend = search(substart, s.end(), delim.begin(), delim.end());
        string temp(substart, subend);
        if(keep_empty || !temp.empty()) {
            result.push_back(temp);    
        }    
        if(subend == s.end()) {
            break;    
        }
        substart = subend + delim.size();
    }

    return result;
}

////////
vector<double> compute(string strPoczatek, string strKoniec, double shipLength) {
    vector<double> wyniki;
    vector<string> vPoczatek = split(strPoczatek, ":");
    vector<string> vKoniec = split(strKoniec, ":");
    int difference;

    // string to int start
    int km = atoi(vPoczatek[0].c_str());
    int min = atoi(vPoczatek[1].c_str());
    int sec = atoi(vPoczatek[2].c_str());
    int startS = km*3600 + min*60 + sec;

    // string to int koniec
    km = atoi(vKoniec[0].c_str());
    min = atoi(vKoniec[1].c_str());
    sec = atoi(vKoniec[2].c_str());
    int koniecS = km*3600 + min*60 + sec;

    if(koniecS > startS) {
        difference = koniecS - startS;
    } else {
        difference = startS - koniecS;    
    }

    wyniki.push_back( ((3600 * shipLength) / difference) / 1000 ); // km/h
    wyniki.push_back( ((3600 * shipLength) / difference) / 1852 ); // mile/h

    return wyniki;
}

int main() {
    vector< double > results;
    string start, koniec;
    double length;
    
    cin >> start >> koniec >> length;
    if(length > 0 && length <= 400) {
        results = compute(start, koniec, length);
        cout << setprecision(1) << fixed << results[0] << " " << results[1] << endl;    
    }
    
    return 0;    
}
0

Problem w tym że najwyraźniej masz problemy z czytaniem.

Wejście
Nieznana liczby przypadków. Każdy przypadek to jedna linia zawierająca:

U ciebie widze JEDEN przypadek, a w zadaniu stoi jak byk że zestawów testowych może być wiele. Ba, przetestuj to nawet na przykładzie z zadania:
http://ideone.com/c8smol
widzisz chyba ze brakuje drugiej linijki z wynikiem?
Musisz zapętlić to co masz w main.

0

Problemów z czytaniem brak, wersje z pętlą również testowałem (na wejściu ilość testów bo bez tego jest błąd (przekroczono limit uruchomienia)) i również nie działa.
Kod z pętlą:

int main() {
    vector< vector<double> > results;
    int t;
    cin >> t;
    results.resize(t);
    string start, koniec;
    double length;
    int i = 0;

    while(i < t) {
        cin >> start >> koniec >> length;
        if(length > 0 && length <= 400) {
            results[i] = compute(start, koniec, length);
        } else { --i; }

        ++i;
    }
    
    for(int i = 0; i < results.size(); ++i) {
        cout << setprecision(1) << fixed << results[i][0] << " " << results[i][1] << endl;    
    }

    return 0;    
}
 
1

Nie no ty chyba poważnie nie ogarniasz tekstu czytanego. Na wejściu NIE MA LICZBY TESTÓW więc twoje wczytywanie t jest bez sensu. Musisz czytać aż w STDIN nie skończą się dane.

int main() {
    vector< double > results;
    string start, koniec;
    double length;
 
    while(cin >> start >> koniec >> length){
		results = compute(start, koniec, length);
    	cout << setprecision(1) << fixed << results[0] << " " << results[1] << endl;    
    }
 
    return 0;    
}

ale przyszłości w konkursach to ci nie wróżę...

0

Zacznij od sprawdzenia danych testowych umieszczonych przy zadaniu.

1

strasznie się nakombinowałeś z tym wczytywaniem danych. Spróbuj tak:

int main() {
    int startH, startM, startS, endH, endM, endS;
    double lenght;

    while(scanf("%d:%d:%d %d:%d:%d %lf ",  &startH, &startM, &startS, &endH, &endM, &endS, &lenght)==7) {
         .... // twoje obliczenia
         printf("%.1lf %.1lf\n", result1, result2);
    }
}

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