Zadanie spoj - statystyka pozycyjna

Zadanie spoj - statystyka pozycyjna
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 miesiące
  • Postów:610
0

Zrobiłem zadanie statystyka pozycyjna na spoj
Link: https://pl.spoj.com/problems/KC022/

Kopiuj
#include <iostream>
#include <set>

using namespace std;

int main()
{
    int n;
    while (cin >> n) {
        cin.get();
        set<int> input_list;
        int k;
        while (cin >> k) {
            input_list.insert(k);
            if (cin.get() != ' ') break;
        }
        if ((int) input_list.size() < n) {
            cout << "-" << endl;
        } else {
            int i = 1;
            for (set<int>::reverse_iterator it = input_list.rbegin(); it != input_list.rend(); ++it) {
                if (i == n) {
                    cout << *it << endl;
                    break;
                }
                ++i;
            }
        }
    }
    return 0;
}

Czy ktoś z kolegów mógłby ułożyć test dla którego nie przechodzi bez podawania rozwiązania?


Fan moderatora somekind
edytowany 1x, ostatnio: Marcin Marcin
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:1605
3

Nie mam niestety teraz czasu na tym myśleć (przerwę mam w pracy), ale mam dla Ciebie ogólną propozycję, jak rozwiązywać takie problemy w przyszłości:

  1. Znajdź sobie gdzieś w sieci rozwiązanie. Nie zaglądaj do niego. Tutaj masz na przykład kogoś, kto wrzuca binarki do repo: https://github.com/LionArt/cpp-SPOJ-easy/tree/master/KC022%20-%20Statystyka%20pozycyjna
  2. Korzystając z pythonowego Hypothesis, z C++-owego RapidChecka, lub czegokolwiek innego, sparuj sobie Twoje odpowiedzi z odpowiedziami wyroczni z punktu pierwszego — albo brute force’a, o którym wiesz, że działa dobrze.

Niech Ci komputer spróbuje znaleźć kontrprzykład. Po co męczyć się lub innych ludzi.

Jak nie wiesz, jak to zrobić, to obiecuję po pracy coś naklepać na szybko, jeśli w międzyczasie nikt inny Ci nie pomoże.

edytowany 1x, ostatnio: Althorion
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około godziny
  • Lokalizacja:Szczecin
2

Kod wygląda dobrze, poza bardzo specyficznym parsowaniem wejścia, a SPOJ jest wybitnie znany z 💩 danych wejściowych. Minimalnie przerobiłem/uodporniłem Twój kod i przechodzi:

Kopiuj
#include <iostream>
#include <set>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    int n;
    string line;
    while (getline(cin, line)) {
    	stringstream in(line);
    	if (!(in >> n))
    		break;
        set<int> input_list;
        int k;
        while (in >> k) {
            input_list.insert(k);
        }
        if ((int) input_list.size() < n) {
            cout << "-" << endl;
        } else {
            int i = 1;
            for (set<int>::reverse_iterator it = input_list.rbegin(); it != input_list.rend(); ++it) {
                if (i == n) {
                    cout << *it << endl;
                    break;
                }
                ++i;
            }
        }
    }
    return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.