Stavo risolvendo un problema di posti a sedere la cui soluzione sembra banale ma non riesco a ottenerla. In breve, il problema è che dobbiamo collocare n (pari) studenti in n / 2 righe in cui gli studenti sono etichettati da 1 a n e non due studenti adiacenti dovrebbero avere etichette consecutive come "1 2" o "5 4". Inoltre, ogni studente è in classe L o R. Nessuna riga dovrebbe avere studenti R nella posizione sinistra e L studente nella posizione giusta contemporaneamente.
Il mio approccio era scegliere prima uno studente da una classe non vuota e poi scorrere tutti gli altri studenti di sinistra in modo che fosse possibile sedersi con lui e farli sedere e così via. In questo processo scelgo prima dalla classe L e lo metto a sinistra e se è vuoto, allora dalla classe R.
Qui:
List<Integer> L = new ArrayList<>();
List<Integer> R = new ArrayList<>();
int n = in.nextInt();//number of students
String s = in.nextLine();//It is a string like "RRLRLRLL" where i^th character is the class of i^th student
for (int i = 0; i < n; i++) {
if (s.charAt(i) == 'L')
L.add(i + 1);
else
R.add(i + 1);
}
for (int i = 0; i < n / 2; i++) {
int x = (L.size() > 0) ? L.remove(0) : R.remove(0);
int y = 0;
if (L.size() > 0) {
y = findfrom(x, L, R);
} else if (R.size() > 0) {
y = findfrom(x, R, L);
}
out.println(x + " " + y);
private int findfrom(int x, List<Integer> L, List<Integer> R) {
int y = -1;
int j = 0;
do {
y = L.get(j);
j++;
} while (Math.abs(y - x) == 1 && j < L.size());
if (Math.abs(y - x) != 1)
L.remove(new Integer(y));
else
y = findfrom(x, R, L);
return y;
}
Ma questo fallirebbe nel caso in cui n = 6 e L = [2,3,6] e R = [1,4,5] (RLLRRL). Ora sceglieremo 2 e 6. Poi 3 e 1. Poi a sinistra ci sono 4 e 5, che è un problema.
Ho anche pensato di fare: - DFS - Accordo casuale seguito dallo scambio dello studente sbagliato con un'altra posizione possibile
Che cosa posso fare, cosa non sto pensando?
Vedi "Problem-234A: Codeforces" per ulteriori dettagli.