Problem z jakim nie mogę sobie dać rady jest następujący:
Mam na wejściu ilość testów, plus dla każdego testu liczbę punktów i konkretne pary liczb (a,b), powiedzmy, że oznaczymy te zmienne:
int testy = 0;
int liczba_punktow = 0;
long int a,b;
- I teraz muszę sprawdzić maksymalną i minimalną wartość dla każdego testu z liczb a i z liczb b
- Zwrócone zostaną 4 wartości w tym jedna powinna się dublować więc powinno się ją odfiltrować
- Kiedy już będę miał 3 wartości potrzebuje je usunąć ze zbiorów odpowiednio a lub b
Ogólnie to kod poniżej nie działa, nie wiem czemu wspolrzedne,size() jest czasami równe 4 dodatkowo zawiera zduplikowane elementy.
Przykład wzięty z dokumentacji -> http://www.cplusplus.com/reference/algorithm/unique/
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
bool isFalse (bool i) { return (i==false); }
int main()
{
int testy = 0;
int liczba_punktow = 0;
long int a,b;
vector<vector<long long> > wyniki;
vector<long int> punkt;
vector<long int> punkty;
vector<bool> marker;
vector <long int> x;
vector <long int> y;
vector <long int> wspolrzedne;
vector<long int>::iterator x_max;
vector<long int>::iterator x_min;
vector<long int>::iterator y_max;
vector<long int>::iterator y_min;
//pobieranie danych wejsciowych
cin >> testy;
for (int i=0; i<testy; i++) {
cin >> liczba_punktow;
punkty.clear();
x.clear();
y.clear();
marker.clear();
for (int j=0; j<liczba_punktow; j++) {
cin >>a>>b;
x.push_back(a);
y.push_back(b);
punkty.push_back(j+1);
marker.push_back(true);
}
//znajdywanie max i min
wspolrzedne.clear();
do {
x_max = max_element(x.begin(), x.end());
y_max = max_element(y.begin(), y.end());
x_min = min_element(x.begin(), x.end());
y_min = min_element(y.begin(), y.end());
wspolrzedne.push_back(distance(x.begin(), x_max));
wspolrzedne.push_back(distance(y.begin(), y_max));
wspolrzedne.push_back(distance(x.begin(), x_min));
wspolrzedne.push_back(distance(y.begin(), y_min));
vector<long int>::iterator it;
it = std::unique (wspolrzedne.begin(), wspolrzedne.end());
wspolrzedne.resize( std::distance(wspolrzedne.begin(),it) );
sort(wspolrzedne.begin(), wspolrzedne.end());
for (int n=wspolrzedne.size()-1; n >= 0; n--) {
if (n == 0 || n == 2) {
x.erase(x.begin()+wspolrzedne[n]);
}
else {
y.erase(y.begin()+wspolrzedne[n]);
}
marker[wspolrzedne[n]] = false;
}
wspolrzedne.clear();
} while (count_if (marker.begin(), marker.end(), isFalse)<liczba_punktow);
}
return 0;
}