#include <iostream> #include <string> #include <algorithm> #include <sstream> #include <vector> #include <iterator> using namespace std; struct talia { int numer; vector<int> wygrywa_z; vector<int> przegrywa_z; talia(int numer_) { numer = numer_; } }; void usunPolaczenia(int a, vector<talia>*v) { for (int i = 0; i < v->size(); i++) { int hehe = v->at(i).przegrywa_z.size(); for (int j = 0; j < v->at(i).przegrywa_z.size(); j++) { if (v->at(i).przegrywa_z[j] == a) v->at(i).przegrywa_z.erase(v->at(i).przegrywa_z.begin() +j); } for (int j = 0; j < v->at(i).wygrywa_z.size(); j++) { if (v->at(i).wygrywa_z[j] == a) v->at(i).wygrywa_z.erase(v->at(i).wygrywa_z.begin() + j); } } } vector<int> najmniej_wygranych(vector<talia> v) { vector<int> min_pos; int min = v[0].wygrywa_z.size(); min_pos.push_back(0); for (int i = 1; i < v.size(); i++) { if (v[i].wygrywa_z.size() > min) { min = v[i].wygrywa_z.size(); min_pos.clear(); min_pos.push_back(i); } else if (v[i].wygrywa_z.size() == min) min_pos.push_back(i); } return min_pos; } vector<int> najwiecej_przegranych(vector<talia> v) { vector<int> max_pos; int max = v[0].przegrywa_z.size(); max_pos.push_back(0); for (int i = 1; i < v.size(); i++) { if (v[i].przegrywa_z.size() < max) { max = v[i].przegrywa_z.size(); max_pos.clear(); max_pos.push_back(i); } else if(v[i].przegrywa_z.size() == max) max_pos.push_back(i); } return max_pos; } int main(int argc, char** argv) { int i; cin >> i; for (; i > 0; i--) { vector<talia> talie_1; vector<talia> talie_2; int numer_talii, ilosc_talii, talie_nieremisujace, a, b; string w; cin >> ilosc_talii >> talie_nieremisujace; for (int j = 0; j < ilosc_talii; j++) { talie_1.push_back(talia(j)); talie_2.push_back(talia(j)); } for(int j = 0;j<talie_nieremisujace;j++){ cin >> a >> w >> b; if (w == "<"){ talie_1.at(a - 1).przegrywa_z.push_back(b - 1); talie_2.at(b - 1).wygrywa_z.push_back(a - 1); } if (w == ">"){ talie_2.at(b - 1).przegrywa_z.push_back(a - 1); talie_1.at(a - 1).wygrywa_z.push_back(b - 1); } } for (int j = talie_1.size()-1; j > 0; j--) { vector<int> b_najwiecej_przegranych, b_najmniej_wygranych, roznicab; b_najwiecej_przegranych = najwiecej_przegranych(talie_2); b_najmniej_wygranych = najmniej_wygranych(talie_2); set_intersection(b_najmniej_wygranych.begin(), b_najmniej_wygranych.end(), b_najwiecej_przegranych.begin(), b_najwiecej_przegranych.end(), back_inserter(roznicab)); if (!roznicab.empty()) { usunPolaczenia(talie_2[roznicab[0]].numer, &talie_1); talie_2.erase(talie_2.begin() + roznicab[0], talie_2.begin() + roznicab[0] + 1); } vector<int> a_najwiecej_przegranych, a_najmniej_wygranych, roznicaa; a_najwiecej_przegranych = najwiecej_przegranych(talie_1); a_najmniej_wygranych = najmniej_wygranych(talie_1); set_intersection(a_najmniej_wygranych.begin(), a_najmniej_wygranych.end(), a_najwiecej_przegranych.begin(), a_najwiecej_przegranych.end(), back_inserter(roznicaa)); if (!roznicaa.empty()){ usunPolaczenia(talie_1[roznicab[0]].numer, &talie_2); talie_1.erase(talie_1.begin() + roznicaa[0], talie_1.begin() + roznicaa[0]+1); } } if (talie_1[0].przegrywa_z.size() == 0 && talie_2[0].przegrywa_z.size() == 0 && talie_1[0].wygrywa_z.size() == 0 && talie_2[0].wygrywa_z.size() == 0) cout << "REMIS" << endl; if (talie_1[0].przegrywa_z.size() == 0 && talie_2[0].przegrywa_z.size() == 1 && talie_1[0].wygrywa_z.size() == 1 && talie_2[0].wygrywa_z.size() == 0) cout << "WYGRANA" << endl; if (talie_1[0].przegrywa_z.size() == 1 && talie_2[0].przegrywa_z.size() == 0 && talie_1[0].wygrywa_z.size() == 0 && talie_2[0].wygrywa_z.size() == 1) cout << "PRZEGRANA" << endl; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <iostream> #include <string> #include <algorithm> #include <sstream> #include <vector> #include <iterator> using namespace std; struct talia { int numer; vector<int> wygrywa_z; vector<int> przegrywa_z; talia(int numer_) { numer = numer_; } }; void usunPolaczenia(int a, vector<talia>*v) { for (int i = 0; i < v->size(); i++) { int hehe = v->at(i).przegrywa_z.size(); for (int j = 0; j < v->at(i).przegrywa_z.size(); j++) { if (v->at(i).przegrywa_z[j] == a) v->at(i).przegrywa_z.erase(v->at(i).przegrywa_z.begin() +j); } for (int j = 0; j < v->at(i).wygrywa_z.size(); j++) { if (v->at(i).wygrywa_z[j] == a) v->at(i).wygrywa_z.erase(v->at(i).wygrywa_z.begin() + j); } } } vector<int> najmniej_wygranych(vector<talia> v) { vector<int> min_pos; int min = v[0].wygrywa_z.size(); min_pos.push_back(0); for (int i = 1; i < v.size(); i++) { if (v[i].wygrywa_z.size() > min) { min = v[i].wygrywa_z.size(); min_pos.clear(); min_pos.push_back(i); } else if (v[i].wygrywa_z.size() == min) min_pos.push_back(i); } return min_pos; } vector<int> najwiecej_przegranych(vector<talia> v) { vector<int> max_pos; int max = v[0].przegrywa_z.size(); max_pos.push_back(0); for (int i = 1; i < v.size(); i++) { if (v[i].przegrywa_z.size() < max) { max = v[i].przegrywa_z.size(); max_pos.clear(); max_pos.push_back(i); } else if(v[i].przegrywa_z.size() == max) max_pos.push_back(i); } return max_pos; } int main(int argc, char** argv) { int i; cin >> i; for (; i > 0; i--) { vector<talia> talie_1; vector<talia> talie_2; int numer_talii, ilosc_talii, talie_nieremisujace, a, b; string w; cin >> ilosc_talii >> talie_nieremisujace; for (int j = 0; j < ilosc_talii; j++) { talie_1.push_back(talia(j)); talie_2.push_back(talia(j)); } for(int j = 0;j<talie_nieremisujace;j++){ cin >> a >> w >> b; if (w == "<"){ talie_1.at(a - 1).przegrywa_z.push_back(b - 1); talie_2.at(b - 1).wygrywa_z.push_back(a - 1); } if (w == ">"){ talie_2.at(b - 1).przegrywa_z.push_back(a - 1); talie_1.at(a - 1).wygrywa_z.push_back(b - 1); } } for (int j = talie_1.size()-1; j > 0; j--) { vector<int> b_najwiecej_przegranych, b_najmniej_wygranych, roznicab; b_najwiecej_przegranych = najwiecej_przegranych(talie_2); b_najmniej_wygranych = najmniej_wygranych(talie_2); set_intersection(b_najmniej_wygranych.begin(), b_najmniej_wygranych.end(), b_najwiecej_przegranych.begin(), b_najwiecej_przegranych.end(), back_inserter(roznicab)); if (!roznicab.empty()) { usunPolaczenia(talie_2[roznicab[0]].numer, &talie_1); talie_2.erase(talie_2.begin() + roznicab[0], talie_2.begin() + roznicab[0] + 1); } vector<int> a_najwiecej_przegranych, a_najmniej_wygranych, roznicaa; a_najwiecej_przegranych = najwiecej_przegranych(talie_1); a_najmniej_wygranych = najmniej_wygranych(talie_1); set_intersection(a_najmniej_wygranych.begin(), a_najmniej_wygranych.end(), a_najwiecej_przegranych.begin(), a_najwiecej_przegranych.end(), back_inserter(roznicaa)); if (!roznicaa.empty()){ usunPolaczenia(talie_1[roznicab[0]].numer, &talie_2); talie_1.erase(talie_1.begin() + roznicaa[0], talie_1.begin() + roznicaa[0]+1); } } if (talie_1[0].przegrywa_z.size() == 0 && talie_2[0].przegrywa_z.size() == 0 && talie_1[0].wygrywa_z.size() == 0 && talie_2[0].wygrywa_z.size() == 0) cout << "REMIS" << endl; if (talie_1[0].przegrywa_z.size() == 0 && talie_2[0].przegrywa_z.size() == 1 && talie_1[0].wygrywa_z.size() == 1 && talie_2[0].wygrywa_z.size() == 0) cout << "WYGRANA" << endl; if (talie_1[0].przegrywa_z.size() == 1 && talie_2[0].przegrywa_z.size() == 0 && talie_1[0].wygrywa_z.size() == 0 && talie_2[0].wygrywa_z.size() == 1) cout << "PRZEGRANA" << endl; } return 0; } |