(SPOJ) 3094 - Elementar, meu caro Watson! - Solução 2
Solução mais eficiente
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
static int gambis(BufferedReader br) throws NumberFormatException, IOException {
int n;
int resp = 0;
while (true) {
n = br.read();
if (n >= '0' && n <= '9') break;
}
while (true) {
resp = resp*10 + n-'0';
n = br.read();
if (n < '0' || n > '9') break;
}
return resp;
}
void processa() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int qteInstancias = gambis(br);
for (int i = 0; i < qteInstancias; i++) {
int qteNumeros = gambis(br);
int[] visitados = new int[qteNumeros];
int[] vetor = new int[qteNumeros];
int contador = 1;
int ciclo = 0;
int qteVisitados = 0;
int tmp;
for (int j = 0; j < qteNumeros; j++) {
vetor[j] = gambis(br)-1;
// se o número já está na ordem, ele foi visitado
if (vetor[j] == j) {
ciclo++;
tmp = vetor[j];
visitados[tmp] = 1; // visita
qteVisitados++;
}
}
for (int j = 0; j < qteNumeros; j++) {
if (visitados[j] == 0) { // verifica se o número já foi visitado
int indice = vetor[j];
visitados[indice] = 1; // visita
qteVisitados++;
tmp = vetor[indice];
while (visitados[tmp] == 0) { // vai vendo os valores que podem ser encontrados com base no numero em questao
indice = vetor[indice];
visitados[indice] = 1; // visita
qteVisitados++;
tmp = vetor[indice];
}
tmp = vetor[indice];
visitados[tmp] = 1; // visita
qteVisitados++;
ciclo++;
}
}
bw.write((qteNumeros-ciclo) + "\n");
}
bw.flush();
bw.close();
return;
}
}
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
static int gambis(BufferedReader br) throws NumberFormatException, IOException {
int n;
int resp = 0;
while (true) {
n = br.read();
if (n >= '0' && n <= '9') break;
}
while (true) {
resp = resp*10 + n-'0';
n = br.read();
if (n < '0' || n > '9') break;
}
return resp;
}
void processa() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int qteInstancias = gambis(br);
for (int i = 0; i < qteInstancias; i++) {
int qteNumeros = gambis(br);
int[] visitados = new int[qteNumeros];
int[] vetor = new int[qteNumeros];
int contador = 1;
int ciclo = 0;
int qteVisitados = 0;
int tmp;
for (int j = 0; j < qteNumeros; j++) {
vetor[j] = gambis(br)-1;
// se o número já está na ordem, ele foi visitado
if (vetor[j] == j) {
ciclo++;
tmp = vetor[j];
visitados[tmp] = 1; // visita
qteVisitados++;
}
}
for (int j = 0; j < qteNumeros; j++) {
if (visitados[j] == 0) { // verifica se o número já foi visitado
int indice = vetor[j];
visitados[indice] = 1; // visita
qteVisitados++;
tmp = vetor[indice];
while (visitados[tmp] == 0) { // vai vendo os valores que podem ser encontrados com base no numero em questao
indice = vetor[indice];
visitados[indice] = 1; // visita
qteVisitados++;
tmp = vetor[indice];
}
tmp = vetor[indice];
visitados[tmp] = 1; // visita
qteVisitados++;
ciclo++;
}
}
bw.write((qteNumeros-ciclo) + "\n");
}
bw.flush();
bw.close();
return;
}
}
Comments
Post a Comment