/* * Solução do problema 'Times' (OBI 2010 - Nível 1, Fase 1) * * Maurício de Lemos Rodrigues Collares Neto () */ #include #include #include #include using namespace std; int main() { int n, k; cin >> n >> k; vector > jogadores; for(int i = 0; i < n; i++) { string nome; int nivel; cin >> nome >> nivel; jogadores.push_back(make_pair(nivel, nome)); } /* O sort do C++ ordena pares de acordo com a primeira coordenada e, * em caso de empate, de acordo com a segunda. Como o problema garante * que não haverão empates na primeira coordenada (o nível), isto ordena * os jogadores do menos habilidoso ao mais habilidoso... */ sort(jogadores.begin(), jogadores.end()); /* ...mas precisamos da ordem contrária. */ reverse(jogadores.begin(), jogadores.end()); /* Agora é só distribuir os jogadores nos times, que serão indexados por * 0 por conveniência. A função módulo determina em qual time o jogador * de número i ira cair (i % k), pois esta função basicamente remove "roda- * das completas" do número i: Os valores de (i % k) quando i muda são: * * i 0, 1, 2, ..., k-1, k, k+1, k+2, ..., * i%k 0, 1, 2, ..., k-1, 0, 1, 2, ..., * * que corresponde a colocar um jogador no time de índice 0, depois no * time de índice 1, depois no time de índice 2, ..., depois no time de * índice k-1, depois no time de índice 0... */ vector times[k]; for(int i = 0; i < n; i++) times[i % k].push_back(jogadores[i].second); /* Agora basta imprimir os times um a um. */ for(int i = 0; i < k; i++) { cout << "Time " << i + 1 << endl; /* Mas queremos os jogadores em ordem alfabética, logo precisamos * ordenar novamente. */ sort(times[i].begin(), times[i].end()); for(int j = 0; j < times[i].size(); j++) cout << times[i][j] << endl; cout << endl; } }