Skip to content

Instantly share code, notes, and snippets.

@pauek
Created May 21, 2024 15:07
Show Gist options
  • Select an option

  • Save pauek/911f4c78027df4ed21ac2dc9ab56142f to your computer and use it in GitHub Desktop.

Select an option

Save pauek/911f4c78027df4ed21ac2dc9ab56142f to your computer and use it in GitHub Desktop.
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
const int IDX_ESCOLA_START = 1000;
const int IDX_ESCOLA_END = 2899;
const int TOTAL_ESCOLES = IDX_ESCOLA_END - IDX_ESCOLA_START + 1;
const int NUM_PREFERIDES = 3;
const int MAX_PLACES = 50;
struct DNI {
int numero;
char lletra;
};
struct Solicitud {
DNI dni;
vector<int> escoles;
bool sense_plasa;
};
struct Escola {
vector<DNI> inscrits;
};
DNI llegeix_dni() {
DNI dni;
cin >> dni.numero >> dni.lletra;
return dni;
}
int llegeix_index() {
int pos;
cin >> pos;
return pos - 1;
}
vector<int> llegeix_escoles_preferides() {
vector<int> escoles(NUM_PREFERIDES);
for (int i = 0; i < NUM_PREFERIDES; i++) {
cin >> escoles[i];
}
return escoles;
}
vector<Solicitud> llegeix_solicituds(int N) {
vector<Solicitud> solicituds(N);
for (int i = 0; i < N; i++) {
const DNI dni = llegeix_dni();
const int index = llegeix_index();
assert(index >= 0 && index < solicituds.size());
Solicitud& solicitud = solicituds[index];
solicitud.dni = dni;
solicitud.escoles = llegeix_escoles_preferides();
solicitud.sense_plasa = false;
}
return solicituds;
}
bool inscriu(Solicitud& solicitud, vector<Escola>& escoles) {
for (int i = 0; i < NUM_PREFERIDES; i++) {
const int idx_esc = solicitud.escoles[i] - IDX_ESCOLA_START;
if (idx_esc >= 0 && idx_esc < escoles.size()) {
Escola& escola = escoles[idx_esc];
if (escola.inscrits.size() < MAX_PLACES) {
escola.inscrits.push_back(solicitud.dni);
return true;
}
}
}
solicitud.sense_plasa = true;
return false;
}
int processa_solicituds(int N,
int R,
vector<Solicitud>& solicituds,
vector<Escola>& escoles) {
int num_sense_plasa = 0;
for (int i = 0; i < N; i++) {
const int index = (R + i) % N;
assert(index >= 0 && index < solicituds.size());
Solicitud& solicitud = solicituds[index];
if (!inscriu(solicitud, escoles)) {
num_sense_plasa++;
}
}
return num_sense_plasa;
}
void escriu_dni(const DNI& dni) {
cout << dni.numero << dni.lletra << endl;
}
void escriu_inscrits(int codi, const Escola& escola) {
cout << "> Escola " << codi << ":" << endl;
for (int i = 0; i < escola.inscrits.size(); i++) {
escriu_dni(escola.inscrits[i]);
}
cout << endl;
}
void escriu_escoles(const vector<Escola>& escoles) {
for (int i = 0; i < escoles.size(); i++) {
const int codi = i + IDX_ESCOLA_START;
const Escola& escola = escoles[i];
if (!escola.inscrits.empty()) {
escriu_inscrits(codi, escola);
}
}
}
void escriu_sense_plasa(const vector<Solicitud>& solicituds) {
cout << "> Sense escola per ara:" << endl;
for (int i = 0; i < solicituds.size(); i++) {
const Solicitud& solicitud = solicituds[i];
if (solicitud.sense_plasa) {
cout << i+1 << ' ';
escriu_dni(solicitud.dni);
}
}
}
int main() {
int N;
cin >> N;
vector<Solicitud> solicituds = llegeix_solicituds(N);
const int R = llegeix_index();
assert(R >= 0 && R < N);
vector<Escola> escoles(TOTAL_ESCOLES);
int num_sense_plasa = processa_solicituds(N, R, solicituds, escoles);
escriu_escoles(escoles);
if (num_sense_plasa > 0) {
escriu_sense_plasa(solicituds);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment