Codeforces Round #162 (Div. 2)に参加してみた!

http://codeforces.com/contest/265

登録したもののなかなか参加出来なかったCodeforcesについに参加しました。
Codeforcesは形式がTopCoderに似ていて、得点は時間依存で、hackというTopCoderの撃墜があります。ただし、hackはコーディング中に行うという点が違います。

以下記録です。

A. Colorful Stones (Simplified Edition)

実装するだけ。でも問題文が英語なので理解に時間がかかりました。3回くらい読み直してようやく分かりました。15分くらい。

import java.util.Scanner;

public class A {

	public static void main(String[] args) {
		doIt();
	}

	static void doIt(){
		Scanner sc = new Scanner(System.in);
		char[] s = sc.next().toCharArray();
		char[] t = sc.next().toCharArray();
		int pos = 0;
		for(int i = 0; i < t.length; i++){
			if(s[pos] == t[i]) pos++;
		}
		System.out.println(pos + 1);
	}

}

B. Roadside Trees (Simplified Edition)

これも実装するだけ。でも問題文が英語なので(略
one secondが1,2のことかと思った自分はもう駄目かもしれない。
これも15分くらい。

import java.util.Scanner;

public class B {

	public static void main(String[] args) {
		doIt();
	}

	static void doIt(){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] h = new int[n];
		for(int i = 0; i < n; i++) h[i] = sc.nextInt();
		int height = h[0];
		int sec = h[0] + 1;
		for(int i = 1; i < n; i++){
			if(height > h[i]){
				sec += height - h[i];
				height = h[i];
			}
			sec++;
			sec += h[i] - height;
			height = h[i];
			sec++;
		}
		System.out.println(sec);
	}

}

C. Roadside Trees (Simplified Edition)

降ってくる石を与えられたように左、右に避け続けた時の最終的な石の並び順を求める問題。

単に左右に石を配置してコードを提出したところ、コンテスト終了直前にhackされてWAでした。
やっぱりシミュレーションかと思ってコンテスト終了後にdoubleで石の位置を覚えておいて、最後にソートしてみたけどWA。どうもdoubleの精度の問題で最後の方は値が同じになってしまい、TreeMapにkeyが同じと見なされているっぽい。どうすればいいんだろう?

D. Good Sequences

与えられた数字の配列から順序を保持し、「隣り合う数字のgcdが2以上」という条件のもとで出来る部分列の最長の長さを求める問題。単純にDPで実装してみたけど、計算量がn^2になり、n <= 10^5なので全然無理。これも分からない。

Eはやってません。


次回参加することがあったらとりあえずCを解くことを目標にします。
C、Dは時間があったら解き直したいなー。


Rating : Unrated → 1435




2013/1/26 追記
C解けました。
アルゴリズムは合っていたっぽいのですが、TLEになっていました。
前はVectorで配列を作りながらシミュレートしていたのと、出力にSystem.out.printlnを使っていたために遅いみたいです。
なのでシミュレートをやめ、出力はPrintWriterでやったところAC。

import java.io.PrintWriter;
import java.util.Scanner;

public class C2 {

	public static void main(String[] args) {
		doIt();
	}

	static void doIt(){
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		char[] input = sc.next().toCharArray();
		for(int i = 0; i < input.length; i++){
			if(input[i] == 'r') out.println(i+1);
		}
		for(int i = input.length - 1; 0 <= i; i--){
			if(input[i] == 'l') out.println(i+1);
		}
		out.flush();
	}
}

次はDをなんとかしたい。