記念すべき初rated参加。
コンテスト参加は2回めだけど前回はDDos攻撃でunratedになった。
A - Overall Winner
・改善点
過半数勝利を先にどっちがするか判定 ⇨ 同点なら先に過半数取ったほうが勝利としているが、そもそも過半数勝利を先にした時点で勝利確定。
過半数勝った時点でbreakしてしまえばよかった。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String s = sc.next(); int t = 0; int a = 0; boolean firstT = false; boolean firstA = false; for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == 'T') { t++; if(s.length() /2 <= t && firstT == false && firstA == false) { //⇐ここで過半数勝利を先にどっちがするか判定 firstT = true; } } if(s.charAt(i) == 'A' ) { a++; if(s.length() /2 <= a && firstT == false && firstA == false) { firstA = true; } } } if(t > a) { System.out.println("T"); return; } else if(t == a) { if(firstT) { System.out.println("T"); } else { System.out.println("A"); } }else { System.out.println("A"); } } }
B - Fill the Gaps
かなり時間がかかったところ。
list.add(i+1+j, list.get(i)+1+j); の部分で何を足して何を引くかこんがらがってしまった。
メモ書きしながら考えを整理しよう。
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List<Integer> list = new ArrayList<>(); for(int i = 0; i < n; i++) { list.add(sc.nextInt()); } for(int i = 0; i < list.size()-1; i++) { if(Math.abs(list.get(i) - list.get(i+1)) != 1) { int num = list.get(i) - list.get(i+1); if(num < 0) { // プラス方向 for(int j = 0; j < Math.abs(num)-1; j++) { list.add(i+1+j, list.get(i)+1+j); //⇐ここで時間かかった。 } // i = 0; } else { // マイナス方向 for(int j = 0; j < Math.abs(num)-1; j++) { list.add(i+1+j, list.get(i)-1-j); //⇐ここも } // i = 0; } } } String s = ""; for(int nn : list) { s += nn + " "; } System.out.println(s.trim()); } }
参考解答
・引用元
Submission #41350087 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)
上位の方の解答コード。
すごくシンプルできれいなコードで感動した。
こういうコードを書けるようになりたいなあ。
何でもかんでもfor文で書いてしまうので、while文もうまく使いたい。
import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner scanner = new Scanner(System.in)) { int n = scanner.nextInt(); int from = scanner.nextInt(); n--; System.out.print(from); for (int i=0;i<n;i++) { int to = scanner.nextInt(); while (from != to) { if (from > to) from--; else from++; System.out.print(" "+from); } } System.out.println(); } } }
C - AtCoder Cards
バケット法。
結構早く解けて満足。
ただ、小文字の a がint数値で何になるかわざわざググってしまったが、 int a = (int) ('a'); で変換してしまえばもっと早かった。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); int[] arr = new int[27]; int[] arr2 = new int[27]; char[] sarr = s.toCharArray(); char[] tarr = t.toCharArray(); for (char c : sarr) { if (c == '@') { arr[26]++; } else { arr[c - 97]++; } } for (char c : tarr) { if (c == '@') { arr2[26]++; } else { arr2[c - 97]++; } } int count = 0; int atcount = 0; for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { atcount = arr[i] + arr2[i]; } else { int diff = Math.abs(arr[i] - arr2[i]); if (diff > 0 && i != 0 && i != 19 && i != 2 && i != 14 && i != 3 && i != 4 && i != 17) { System.out.println("No"); return; } count += diff; } } if (atcount >= count) { System.out.println("Yes"); } else { System.out.println("No"); } } }