パナソニックグループプログラミングコンテスト2022(AtCoder Beginner Contest 251)
- A - Six Characters
- B - At Most 3 (Judge ver.)
- C - Poem Online Judge
- D - At Most 3 (Contestant ver.)
- E - Tahakashi and Animals
- F - Two Spanning Trees
コンテスト前のレート:1969
レート通りのパフォーマンスが得られる順位:309位(2000点、76分43秒)
A - Six Characters
思考過程
- の長さは必ずの約数。
- 長さが未満である限りを付け足していけば、どこかで長さがちょうどになる。
import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); String s = sc.next(); sc.close(); String ans = s; while (ans.length() < 6) { ans += s; } System.out.println(ans); } }
ここまで1分00秒+0ペナ。385位。
B - At Most 3 (Judge ver.)
思考過程
- が間に合う制約。
- 添え字が重複しない形で三重ループを回して、の場合にSetに入れていって要素数を出力する。 →例1がになる。
- 個ちょうどではなく以下だったので、とについても対象にする。
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int w = sc.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } sc.close(); Set<Integer> set = new HashSet<>(); for (int i = 0; i < n; i++) { int b = a[i]; if (b <= w) { set.add(b); } for (int j = 0; j < i; j++) { b = a[i] + a[j]; if (b <= w) { set.add(b); } for (int k = 0; k < j; k++) { b = a[i] + a[j] + a[k]; if (b <= w) { set.add(b); } } } } System.out.println(set.size()); } }
ここまで4分01秒+0ペナ。166位。
C - Poem Online Judge
思考過程
- オリジナルな提出かどうかをSetで判定し、そうであれば最大値の判定とインデックスの保持を行う。
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] s = new String[n]; int[] t = new int[n]; for (int i = 0; i < n; i++) { s[i] = sc.next(); t[i] = sc.nextInt(); } sc.close(); Set<String> set = new HashSet<>(); int max = 0; int ans = 0; for (int i = 0; i < n; i++) { if (set.add(s[i])) { if (t[i] > max) { max = t[i]; ans = i; } } } System.out.println(ans + 1); } }
ここまで6分26秒+0ペナ。79位。
D - At Most 3 (Contestant ver.)
問題
一瞬Bと同じ問題が間違って設定されているのかと思った。
しょうもないミスで1ペナ。
思考過程
- 入力のは意味がない。であるとして、全ケース同じ出力でよい。
- のように、構成不可能な値が出てきたところでそれを入れていくことを考えてみるが、入れていく値の間隔が広がっていく気があまりしない。
- 仮に数の組み合わせで~くらいを全部作れれば、つ目用にを用意しておけばよい。
- ただし、の制約的に、個以内でくらいまでを作れる必要がある。
- つ目用に~を入れたとすると、つ目用はにできる。
- 個ずつ使えば、、、でちょうどでは?
- 進数であると考えれば漏れはなさそう。 →全ケースWA
- B問題の提出コードを引っ張ってきて問題ないことを確認する。
- 出力にが抜けていると気付く。
import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int w = sc.nextInt(); sc.close(); int[] a = new int[300]; for (int i = 0; i < 100; i++) { a[i] = i + 1; } for (int i = 0; i < 100; i++) { a[i + 100] = (i + 1) * 100; } for (int i = 0; i < 100; i++) { a[i + 200] = (i + 1) * 10000; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < 300; i++) { sb.append(a[i]).append(' '); } sb.deleteCharAt(sb.length() - 1); System.out.println(300); System.out.println(sb.toString()); } }
ここまで22分16秒+1ペナ。262位。
E - Tahakashi and Animals
思考過程
- 番目まで見て最後の動物に餌をあげているかいないかのつの配列を用意してDPをやってみるが、どうにもとのところの帳尻合わせが怪しい。
- 情報量が過剰な気もするが、動物にあげているかどうかと、最後の動物にあげているかどうかを組み合わせたつを用意してDPをすることにする。
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] sa = br.readLine().split(" "); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = Integer.parseInt(sa[i]); } br.close(); long[] dp00 = new long[n + 3]; // 動物1:×、動物i:× long[] dp01 = new long[n + 3]; // 動物1:×、動物i:○ long[] dp10 = new long[n + 3]; // 動物1:○、動物i:× long[] dp11 = new long[n + 3]; // 動物1:○、動物i:○ dp11[1] = a[n - 1]; for (int i = 2; i <= n; i++) { // dpx1への遷移:i-2まで済の場合とi-1まで済の場合のminに、 // i-1とiにあげるコストを追加 // dpx0への遷移:i-1まで済の状態そのもの dp11[i] = Math.min(dp10[i - 1] + a[i - 2], dp11[i - 1] + a[i - 2]); dp10[i] = dp11[i - 1]; dp01[i] = Math.min(dp00[i - 1] + a[i - 2], dp01[i - 1] + a[i - 2]); dp00[i] = dp01[i - 1]; } long ans = Math.min(dp11[n], dp00[n] + a[n - 1]); System.out.println(ans); } }
ここまで37分13秒+1ペナ。254位。
F - Two Spanning Trees
思考過程
- 例1を描いてみると、はなるべく頂点と繋がる辺を除外していて、はなるべく頂点と繋がる辺を残しているように見える。
- 実際については、多数に枝分かれしている頂点から最小限の辺だけ残すようにすると、除外した辺は必然的に子と繋がっていることになりそう。
- DFS順に辿った場合を考えてみると問題なさそうに思える。
- でははBFS順だったりするか? →問題なさそうに思える。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; public class Main { static int n, m; static List<List<Integer>> list; static boolean[] visit; static List<String> ans; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] sa = br.readLine().split(" "); n = Integer.parseInt(sa[0]); m = Integer.parseInt(sa[1]); list = new ArrayList<>(n); for (int i = 0; i < n; i++) { list.add(new ArrayList<>()); } for (int i = 0; i < m; i++) { sa = br.readLine().split(" "); int u = Integer.parseInt(sa[0]) - 1; int v = Integer.parseInt(sa[1]) - 1; list.get(u).add(v); list.get(v).add(u); } br.close(); // T1 visit = new boolean[n]; ans = new ArrayList<>(n - 1); dfs(0, -1); PrintWriter pw = new PrintWriter(System.out); for (String s : ans) { pw.println(s); } // T2 visit = new boolean[n]; ans = new ArrayList<>(n - 1); Queue<Integer> que = new ArrayDeque<>(); que.add(0); visit[0] = true; while (!que.isEmpty()) { int cur = que.poll(); for (int next : list.get(cur)) { if (!visit[next]) { ans.add((cur + 1) + " " + (next + 1)); que.add(next); visit[next] = true; } } } for (String s : ans) { pw.println(s); } pw.flush(); } static void dfs(int x, int p) { visit[x] = true; for (int c : list.get(x)) { if (c != p && !visit[c]) { ans.add((x + 1) + " " + (c + 1)); dfs(c, x); } } } }
ここまで50分13秒+1ペナ。152位。
G問題はで各辺を最も厳しく移動させた位置を前計算、で各クエリについて辺全てが条件を満たすか判定ということを思い付いた時点でまだ30分以上残っていたので、判定方法を簡単に調べたりしつつちんたら実装していたが、結局間に合わず。
一応時間内にぎりぎり初回実装は終わったのだが、配列外参照をしているような状態のまま時間切れ。
終了10分後くらいにとりあえず動くものはできたが、例2が4つほど合わず、その先はすぐには直せなさそうな状態。
最終結果:ABCDEFの6完2000点、55分13秒、190位、パフォーマンス2200
レート変動:1969→1994(+25)
Dでペナ出さなければ黄色復帰に届いていたが、Eが若干怪しいまま一発で通ったのもあるので、まあこんなものなんだろうとは思う。
せっかく十分な時間が残っていたので、Gもなんとかしたかった。幾何弱い。
ABCで200位以内なのがABC231(今回同様パナソニックコン!)以来。
Dで詰まった時はまた今回も駄目かと思ったが、Fが早く解けたのに救われた。