TopCoder e Maratona de programação

6 respostas
Andre_Brito

De que adianta ser um programador Java sem lógica?

Alguém participa no TopCoder usando Java? Eu participo, porém, queria começar a usar na Maratona de Programação, organizada pela ACM e pela SBC.
Eu pretendo usar Java, mas meus amgios tiveram sérios problemas com as entradas do teclado. Acho que o sistema usado é o BOCA e já existem entradas prontas em arquivos .in (eu acho). Alguém teve sucesso usando Java na Maratona de Programação da SBC? No TopCoder é um tanto diferente, porque você não usa Scanner, mas sim contrói um método que já recebe parâmetros.

Por exemplo,

Isso se dá após a descrição do problema. Eu queria saber também, como achar o tamanho do array que ele passa por parâmetro em C++. Em Java, uso o método .length (sem parênteses) e ele me retorna o tamanho, mas em C++ acredito que não seja possível fazer isso.

Bom, o site fica pro pessoal viciado em problemas de lógica. Eu sou um deles :slight_smile:

Abraço.

6 Respostas

Aldrin_Leal

No boca, os arquivos .in são lidos e escritos para o stdout. Eu geralmente costumo usar um stub padrão (abaixo, uma saída para o Jogo do Bicho - Algoritmo Excluído por Motivos Óbvios):

public class bicho {
	/**
	 * Saída
	 */
	private final PrintStream out;

	/**
	 * Entrada
	 */
	private final BufferedReader in;

	/**
	 * Constructor
	 * 
	 * @param args
	 *            argumentos [entrada [saida]]
	 * @throws Exception
	 */
	public bicho(String[] args) throws Exception {
		PrintStream out = System.out;
		InputStream inputStream = System.in;

		if (args.length > 0) {
			inputStream = new FileInputStream(args[0]);

			if (args.length > 1)
				out = new PrintStream(args[1]);
		}

		this.in = new BufferedReader(new InputStreamReader(inputStream));
		this.out = out;
	}

	private static final Pattern PATTERN_ENTRADA = Pattern
			.compile("^(\d+\.\d+) (\d+) (\d+)$");

	/**
	 * Ponto de Execução
	 * 
	 * @throws Exception
	 */
	public void executar() throws Exception {
		String linha = null;

		while (null != (linha = in.readLine())) {
			Matcher matcherLinha = PATTERN_ENTRADA.matcher(linha);

			/**
			 * Encerra
			 */
			if (!matcherLinha.matches())
				break;

			out.println(vPremio.toPlainString());

		}
	}

	/**
	 * @param args
	 *            argumentos [entrada [saida]]
	 */
	public static void main(String[] args) throws Exception {
		bicho objBicho = new bicho(args);

		objBicho.executar();
	}

Este Stub tem algumas funcionalidades. Em particular, eu o uso para poder trabalhar em casa, fora a preocupação da competição. Isto explica os comentários e a capacidade, entre outros, de poder ler vários arquivos de testes de caso (o oficial e algum outro que eu criar).

Quanto ao Topcoder, não vi a sintaxe pra C++, mas mesmo não tendo length em array, acho que existem outros mecanismos que eles informam.

Andre_Brito

Não entendi direito… se eu fizesse só a main e lá dentro usasse o Scanner, não seria mais simples? Digo, o BOCA conseguiria ler e emitir a saída desejada?

Aldrin_Leal

Bem, eu demonstrei o I/O. Se você quer usar o Scanner, é uma opção sua.

Andre_Brito

Hehe, e agradeço por ter mostrado. É uma opção que já é comprovada que funciona, certo?

Agora, com Scanner, funcionaria da mesma maneira?

Aldrin_Leal

Basicamente da mesma maneira, embora eu não seja íntimo do Scanner pra poder te dizer como. Cabe a mim apenas desejar boa sorte. :slight_smile:

L

dedejava:
Hehe, e agradeço por ter mostrado. É uma opção que já é comprovada que funciona, certo?

Agora, com Scanner, funcionaria da mesma maneira?

Funcionaria.

Mas o Scanner é bem mais lento, sendo assim, na maratona vc corre um grande risco de tomar uma TLE por conta do Scanner.
De preferência ao BufferedReader. Use Scanner apenas quando vc tem certeza que a leitura não afetará em muito o tempo.

Experiência de quem já esteve lá! Usando Java, sempre! Embora hj eu use C++ e a consagrada STL, e recomendo. :slight_smile:

Criado 2 de janeiro de 2008
Ultima resposta 3 de jan. de 2008
Respostas 6
Participantes 3