#include #include #include using namespace std; struct ucastnik{ string meno; float value; //int poradie; bool predavajuci; //ak false tak kupuje vector ludia; //ludia, s ktorymi uzavrie dohodu ucastnik(string s, float v, bool p) : meno(s), value(v), predavajuci(p) {} }; bool comparePodlaValue(ucastnik* u1, ucastnik* u2){ return ((u1->value)<(u2->value)); } //najde najvyssie uz nevyhovujuce cislo int findMaxFits(vector &vect,float val){ int idx; int begin = 0; int end = vect.size(); int size = end-begin; float tmp; idx = end/2; cout << "binary search value " << val; if (end == 0) return -1; //ak v poli nic nie je if (vect[end-1]->value <= val) return (end); //ak su v poli vsetky mensie rovne, tak prve nevyhovujuce je mimo pola if (vect[0]->value > val) return 0; while (size){ idx = (begin + end)/2; tmp = vect[idx]->value; cout << "findMaxFits [i] = " << tmp << endl; if (tmp == val){ do {idx++;} while ( (idx < vect.size()-1) && (vect[idx+1]->value == val) ); break; } else if (tmp < val){ //hladana hodnota je viac na pravo begin = idx; } else if (tmp > val){ //hladana hodnota je viac na lavo end = idx; } size = end-begin; } cout << idx << endl; return idx; } //najde najmensie este vyhovujuce int findMinFits(vector &vect,float val){ int idx; int begin = 0; int end = vect.size(); int size = end-begin; float tmp; idx = end/2; cout << "binary search value " << val; if (end == 0) return 1; //ak v poli nic nie je if (vect[0]->value > val) return end; //ak su v poli vsetky vacsie, tak prve nevyhovujuce je [0] if (vect[end-1]->value <= val) return 0; while (size){ idx = (begin + end)/2; tmp = vect[idx]->value; cout << "findMinFits [i] = " << tmp << endl; if (tmp == val){ while ( (idx < vect.size()-1) && (vect[idx+1]->value == val) ) idx--; break; } if (tmp < val){ //hladana hodnota je viac na pravo begin = idx; } else if (tmp > val){ //hladana hodnota je viac na lavo end = idx; } size = end-begin; } if (vect[idx]->value > val) idx--; cout << idx << endl; return idx; } int main() { int pocetLudi; string menoFirmy; string name; string typ; float value; bool predava; cin >> pocetLudi; cin >> menoFirmy; while ( (pocetLudi!= 0) && (menoFirmy != "END")){ vector ucastnici; ucastnici.reserve(pocetLudi); for (int i = 0; i < pocetLudi; i++){ cout << "tvorim noveho ucastnika" << endl; cin >> name >> typ >> value; if (typ == "sell") predava = true; else predava = false; ucastnici.push_back(ucastnik(name, value, predava)); } cout << "ucastnici nacitani" << endl; vector predavajuci; vector kupujuci; for (int i = 0; i < pocetLudi; i++){ if (ucastnici[i].predavajuci == true ){ predavajuci.push_back(&(ucastnici[i])); } else kupujuci.push_back(&(ucastnici[i])); } cout << "ucastnici rozdeleni" << endl; sort(kupujuci.begin(), kupujuci.end(), comparePodlaValue); sort(predavajuci.begin(), predavajuci.end(), comparePodlaValue); cout << "ucastnici utriedeni" << endl; //hladame vhodne ponuky pre kupujucich int cnt = kupujuci.size(); for (int i = 0; i < cnt; i++){ int idx = findMaxFits(predavajuci, kupujuci[i]->value); //kupujuci udava maximalnu cenu for (int j = 0; j < idx; j++) kupujuci[i]->ludia.push_back(predavajuci[j]); } //hladame vhodne ponuky pre predavajucich cnt = predavajuci.size(); for (int i = 0; i < cnt; i++){ int idx = findMinFits(kupujuci, predavajuci[i]->value); //predavajuci udava maximalnu cenu //hotfix na najlavejsi prvok while ( (idx > 0) && (kupujuci[idx-1]->value == predavajuci[i]->value) ) idx--; for (int j = idx; j < kupujuci.size(); j++) predavajuci[i]->ludia.push_back(kupujuci[j]); } cout << "obchody rozdelene" << endl; for (int i = 0; i < pocetLudi; i++){ cout << ucastnici[i].meno << ":"; if (ucastnici[i].ludia.size()==0){ cout << " NO-ONE"; } else { int cnt = ucastnici[i].ludia.size(); for (int j = 0; j < cnt; j++){ cout << " " << ucastnici[i].ludia[j]->meno; } } cout << endl; } cin >> pocetLudi; cin >> menoFirmy; } return 0; }