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
またこんど
まとめ
一か月間もまともにプログラミングしないでいると、能力はそれなりに落ちるみたいです。具体的には、
・コードを記述するスピード
・文法
・問題の理解速度
などの能力にずいぶん衰えを感じました。これからは(たとえ忙しくても)サボらないようにしたいと思います。