夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

正々堂々?Javaで挑んだら…

こんにちは!

というわけでCodeforces#65 Div.2の戦況報告です。


Div2ということで比較的簡単な問題となっていましたが、一問しかとけませんでしたorz
とりあえずご紹介と、教訓。

A. Way To Long Words

サービス問題。だけどミスってしまった。

問題の趣旨はまぁ入力された文字列の文字数が10文字より上ならば、最初と最後の文字だけ残して、真ん中に省略した文字数をいれて出力みたいな感じ。

んで、これは簡単♪と余裕で出した解答がコレ

import java.io.*;

public class A {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[][] str = new String[n][];
		String[] ans = new String[n];
		for (int i = 0; i < n; i++)
			str[i] = br.readLine().split("");
		String s;
		for (int i = 0; i < n; i++) {
			if (str[i].length <= 10) {
				s = "";
				for (int j = 1; j < str[i].length; j++) s += str[i][j];
				ans[i] = s;
			} else {
				String a = String.valueOf(str[i].length-3);
				ans[i] = str[i][1] + a + str[i][str[i].length-1];
			}
		}
		for (int i = 0; i < n; i++)
			System.out.println(ans[i]);
	}
}

しかし、画面のサンプルを入力してもバグは起こらないしと思っていたこれがなぜかプレテスト2で引っかかる。

コンテスト終了後、やはり納得できなくて他の人のコードみたら

String s = ... // これが入力文字列だとして
ans = s.charAt(0)+(s.length()-2)+s.charAt(s.length()-1);

となっていて、あぁなるほど。と思った。

でも他の部分は同じでどうもこれが影響してるとは思えない。

そういえば配列の最初に空文字が入って最初バグらせてたな・・・ととりあえず思って終了後ちょっと配列の要素をすべて出力させてみた。


でも、やはり気づいていたどおり

                                                        • +
  1. ""|"a"|"b"|............|"x"|
                                                        • +

となっているだけ。

でもここであることに気づいた。

そのテスト中適当にincreadingなどと適当な感じにうってたら出力に

i8g

と出てきたのである。

…8?

もう一度コードを見直してようやく間違いを訂正したのがコチラ。

import java.io.*;

public class A {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[][] str = new String[n][];
		String[] ans = new String[n];
		for (int i = 0; i < n; i++)
			str[i] = br.readLine().split("");
		String s;
		for (int i = 0; i < n; i++) {
			if (str[i].length-1 <= 10) {
				s = "";
				for (int j = 1; j < str[i].length; j++) s += str[i][j];
				ans[i] = s;
			} else {
				String a = String.valueOf(str[i].length-3);
				ans[i] = str[i][1] + a + str[i][str[i].length-1];
			}
		}
		for (int i = 0; i < n; i++)
			System.out.println(ans[i]);
	}
}

でも不思議なのは一回str[i].length < 10と書いていたのに…サブミットしてなかったのかもw(追記:違った。よくよく考えたら全然違う式だ。)

惜しい逃し方をしました。

B Progress bar

これはすぐわかった。

プログレスバーの升の数と一升に対応する上限値とパーセンテージからプログレスバーの状態を出力みたいなやつ。

こんなコードになった。

import java.io.*;

public class B {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] nums = br.readLine().split(" ");
		int n = Integer.parseInt(nums[0]); int k = Integer.parseInt(nums[1]); int t = Integer.parseInt(nums[2]);
		int max = n*k;
		int ans = (int)max*t/100;
		int view = 0;
		boolean count = true;
		for (int i = 0; i < n; i++) {
			if (i != 0) System.out.print(" ");
			view += k;
			if (view <= ans) {
				System.out.print(k);
			} else if (view > ans && count) {
				System.out.print(ans%k);
				count = false;
			} else {
				System.out.print(0);
			}
		}
		System.out.println();
	}
}

うん(笑)

これは文句無しに通ったからあんま他の人の解答はみてない。
もっと綺麗なのはあるかも。

E Nuclear Fusion

これはちょっと問題としていっていたので(笑)

なんと原子番号100番までの元素を原子記号でn個とk個あたえるからそれで原子番号が等しくなるような組み合わせを…っていってもわからんよな(笑)

とにかく問題としてどうかしてるぜ!!


Noteに「元素のことは君の好きなサーチエンジンでしらべてくれ(キリッ」って書かれてもねぇwwww


まぁちょうど手元に周期表あったんで一応途中まで書きました。肝心なところがわからず終わったけど(しかもただでさえコンパイルエラーが出るコードw)

import java.io.*;
import java.util.*;

public class E {
	public String[] atoms = {"H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zu","Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
		"Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",};
	public static int linearSearch(String key) {
		int i;
		for (i = 0; i < 100; i++) {
			if (atoms[i].equals(key))
				return i+1;
		}
		return -1;
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] ary1 = br.readLine().split(" ");
		int n = ary1[0]; int k = ary1[1];
		String[] ary2 = br.readLine().split(" "); String[] ary3 = br.readLine().split(" ");
		int[] ary4 = new int[n]; int[] ary5 = new int[k];
		for (int i = 0; i < n; i++)
			ary4[i] = linearSearch(ary2[i]);
		for (int i = 0; i < k; i++)
			ary5[i] = linearSearch(ary3[i]);
		int[][] ary6 = new int[k];
		int sum = 0;
/*		for (int i = 0; i < k; i++) {

		}*/
		System.out.println("NO");
	}
}

とりあえずこの配列つくってなければAも時間内に気づいてたかもね(←軽く後悔


Eで正解してる人は・・・探せなくなってたw
大体そういう人は最初のほうでサブミットしてるからね(^^;)

最後に。

システムテストがおわり、Practiceとして使えるようになったのでAの正しい答えサブミットしました。90ms。charAtパターンも作成してタイムの差を見てみよう。
レーティングが楽しみです(笑)