Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

AtCoder Beginner Contest 093

※今回は不参加で、問題はすべてコンテスト終了後に解きました。

A - abc of ABC

import static java.lang.System.*;
import java.util.*;
 
public class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		String s = sc.next();
		boolean a=false,b=false,c=false;
		if (s.contains("a")) a = true;
		if (s.contains("b")) b = true;
		if (s.contains("c")) c = true;
		
		if (a && b && c) out.println("Yes");
		else out.println("No");
	}
}

boolean型の変数でabcそれぞれの出現を管理して、すべて出現したならばYesを出力する。
文字列を1文字ずつ分解して配列で受け取って、ソートしたときに"abc"と一致するかという方法もあるけれど、記述の手間を考えればどちらでもよいと思います。

追記:if (s.contains("a") && s.contains("b") && s.contains("c")) とすれば一行で書けますね……


B - Small and Large Integers

import static java.lang.System.*;
import java.util.*;
 
public class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		int a = sc.nextInt();
		int b = sc.nextInt();
		int k = sc.nextInt();
		TreeSet<Integer> set = new TreeSet<>();
		for (int i=a; i<=Math.min(b,a+k-1); i++) set.add(i);
		for (int i=b; i>=Math.max(a,b-k+1); i--) set.add(i);
		set.forEach(out::println);
	}
}

WAを一回出してしまいました。
問題を見たときに、範囲が重複するだろうなと思ってSetを持ち出したところまではよかったのですが、そのあとのループの回しかたでミスをしてしまいました。若干悪戦苦闘しつつ、ループの条件式をいじくり回してなんとかAC。


C - Same Integers

import static java.lang.System.*;
import java.util.*;
 
public class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		int a=sc.nextInt(), b=sc.nextInt(), c=sc.nextInt();
		int max = Math.max(a,b); max = Math.max(max,c);
		int sum = a+b+c;
		
		
		if (sum%2 == (3*max)%2) {
			out.println((3*max-sum)/2);
		}
		else {
			out.println((3*(max+1)-sum)/2);
		}
	}
}

以前に見たような問題だったけれど、ぱっと解法が思いつかなかったので解説を見ました。
ポイントは「操作によって3数の和の偶奇は変化しない」というところのようです。

公式の解説には「この下限が達成できることは簡単にわかるので、この問題を解くことができました」とあったのですが、いまいち理解できなかったので、解説してくださっている記事を探したところ、以下の記事にとても分かりやすい解説がありました。

AtCoder Beginner Contest 093 - forestelementsの日記

要は、3つの数が同値を達成する寸前のパターンが(どう操作しても)2通りしかなく、その2通りで場合分けすればよいみたいです。


D - Worst Case

またこんど


まとめ

一か月間もまともにプログラミングしないでいると、能力はそれなりに落ちるみたいです。具体的には、

・コードを記述するスピード
・文法
・問題の理解速度

などの能力にずいぶん衰えを感じました。これからは(たとえ忙しくても)サボらないようにしたいと思います。