0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ABC - 059 - A&B&C

Posted at

AtCoder ABC 059 A&B&C

AtCoder - 059

A問題

  • 先頭だけ取り出して大文字に変換して出力
	private void solveA() {
		StringBuilder builder = new StringBuilder();
		IntStream.range(0, 3).forEach(i -> builder.append(next().charAt(0)));
		out.println(builder.toString().toUpperCase());
	}

B問題

  • 数値の大小比較
  • 問題は $ 1\leqq A,B \leqq 10^{100}$ という大きさ
    • 桁あふれが...

とりあえず力技
javaのBigDecimalを利用する。
ちょうど文字列として取得することが可能なのでBigDecimalをnewするにも都合がよい。

	private void solveB() {
		BigDecimal v1 = new BigDecimal(next());
		BigDecimal v2 = new BigDecimal(next());

		switch (v1.compareTo(v2)) {
		case -1:
			out.println("LESS");
			break;
		case 0:
			out.println("EQUAL");
			break;
		case 1:
			out.println("GREATER");
			break;
		}

	}

通った・・・

本当は通らない想定だと思うので、一文字ずつ文字列として判定する方法も試してみた。
テストケース通した感じだと、速度もメモリもBigDecimalと変わらなかった。
Bigdecimalの方が楽だ。

	private void solveB2() {
		String v1 = next();
		String v2 = next();

		int res = -9;
		if (v1.length() > v2.length()) {
			res = 1;
		} else if (v1.length() < v2.length()) {
			res = -1;
		} else {
			for (int i = 0; i < v1.length(); i++) {
				if (v1.charAt(i) > v2.charAt(i)) {
					res = 1;
					break;
				} else if (v1.charAt(i) < v2.charAt(i)) {
					res = -1;
					break;
				}
			}
		}

		if (res == -9) {
			res = 0;
		}

		switch (res) {
		case -1:
			out.println("LESS");
			break;
		case 0:
			out.println("EQUAL");
			break;
		case 1:
			out.println("GREATER");
			break;
		}
	}

C問題

これを書いている時点でも理解しているとは言いづらい状態ではあるが、、、
大半の説明はコード中にインラインで記載している。

  • すべての$i(1 \leqq i \leqq n)$ に対し、$第1項$から$第i項$までの和は$0$でない
  • すべての$i(1 \leqq i \leqq n−1)$ に対し、$i項$までの和と$i+1項$までの和の符号が異なる
1 2 3 4 5 備考 手数
入力 0 0 0 0 0
操作 $1$ $-2$ $2$ $-2$ $2$ この形になるように操作すれば条件を満たす。
1番目を+方向へ操作
$9$
操作 $-1$ $2$ $-2$ $2$ $-2$ この操作でも条件を満たす。
1番目を-方向へ操作
$9$
1 2 3 4 5 備考 手数
入力 1 2 3 4 5
操作 $1$ $-2$ $3$ $-3$ $ 5$ この形になるように操作すれば条件を満たす $11$
操作 $-1$ $2$ $-2$ $4$ $-4$ この操作でも条件を満たす $16$
  • 最初の値を+に取るか-に取るかの2パターンで手数の少ないほうを採用する
	private void solveC() {
		final int numN = nextInt();
		int[] wkB = IntStream.range(0, numN).map(i -> nextInt()).toArray();

		long sum1 = 0;
		long cnt1 = 0;
		// a[0]を+にした場合の判定
		for (int i = 0; i < numN; i++) {
			sum1 += wkB[i]; //1--iの合計
			if (i % 2 == 0 && sum1 <= 0) { //偶数番で-の時は反転
				cnt1 += (1 - sum1);//+-を反転させる最小手数(-になっているのでこれで+1までの手数になる)
				sum1 = 1; //sum1を1にすることで、次の判定は+となる
			} else if (i % 2 == 1 && sum1 >= 0) {
				cnt1 += (1 + sum1);//+-を反転させる最小手数(+になっているのでこれで-1になる手数になる)
				sum1 = -1;//sum1を-1にすることで、次の判定は-となる
			}
			/*
			 * 偶数の時マイナス・奇数の時プラスだったら次合致するときにすべての整合性を取ればよい
			 *
			 */

		}

		long sum2 = 0;
		long cnt2 = 0;
		// a[0]を-にした場合の判定
		for (int i = 0; i < numN; i++) {
			sum2 += wkB[i]; //1--iの合計()
			if (i % 2 == 1 && sum2 <= 0) { //偶数番で+の時は反転
				cnt2 += (1 - sum2);//+-を反転させる最小手数(-になっているのでこれで-1までの手数になる)
				sum2 = 1; //sum2を-1にすることで、次の判定は-となる
			} else if (i % 2 == 0 && sum2 >= 0) {
				cnt2 += (1 + sum2);//+-を反転させる最小手数(+になっているのでこれで-1になる手数になる)
				sum2 = -1;//sum2を-1にすることで、次の判定は+となる
			}
			/*
			 * 偶数の時プラス・奇数の時マイナスだったら次合致するときにすべての整合性を取ればよい
			 *
			 */

		}

		out.println(Math.min(cnt1, cnt2));
	}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?