0
0

概要

AtCoder主催のAtCoder Beginner Contest 358が、
2024年6月15日(土)21時から開催されました。
私は失念しており不参加です。

解説なし、時間無制限で解けるところまでやってみます。

A

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    var sc = new Scanner(System.in);
    String S = sc.next(), T = sc.next();
    if(S.equals("AtCoder") && T.equals("Land")) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
}

文字列が2つ入力されるので、比較する。

B

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    var sc = new Scanner(System.in);
    int N = sc.nextInt();
    int A = sc.nextInt();
    int[] T = new int[N];
    for (int i = 0; i < N; i++) {
      T[i] = sc.nextInt();
    }

    int tmp = 0;
    for (int i : T) {
      if (i > tmp) {
        tmp = i;
      }
      tmp += A;
      System.out.println(tmp);
    }
  }
}

B問題にしてはちょっと悩みました。
Ti(入場者がチケット売り場に来た時間)と
1つ前の入場者がチケットを受け取る時間を比較して時間が長い方に、
A(チケット購入手続き時間)を足せばよい。

C

import java.util.Arrays;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    var sc = new Scanner(System.in);

    int N = sc.nextInt(), M = sc.nextInt();

    String[][] s = new String[N][M];
    for (int i = 0; i < N; i++) {
      var S = sc.next().toCharArray();
      for (int j = 0; j < M; j++) {
        s[i][j] = String.valueOf(S[j]);
      }
    }

    // ベースのBoolean配列
    Boolean[] base = new Boolean[M];
    for (int i = 0; i < M; i++) {
      base[i] = false;
    }

    // bit全探索
    int min = 10;
    for (int i = 0; i < 1 << N; i++) {
      Boolean[] check = Arrays.copyOf(base, M);
      int buyCount = 0;
      for (int j = 0; j < N; j++) {
        if ((1 & i >> j) == 1) {
          // 購入店舗数として出力する
          buyCount++;
          // check配列のIndexとして使用する
          int storeNum = 0;
          // 1文字ずつ○×を判定する
          for (String taste : s[j]) {
            if (taste.equals("o")) {
              check[storeNum] = true;
            }
            storeNum++;
          }
        }
      }
      // 全てtrueなら購入店舗数を出力
      if (!Arrays.asList(check).contains(false) && min > buyCount) {
        min = buyCount;
      }
    }
    System.out.println(min);
  }
}

問題を読んですぐbit全探索だと思う。
シフト演算子を毎回どうするのか忘れてしまうためググる。

最短で合致する購入店舗数=最低購入店舗数だと勘違いしていたため、
一度結果がWAを出してしまいました。
Arrays.copyOfなんて初めて使いました。
checkは元々プリミティブ型の配列を考えていましたが、
Arrays.asListのcontainsした時の動作が変わってしまうため急遽参照型に変更。
Arrays.asListはオートボクシングしないという仕様で引っかかっていました。
その結果宣言した際にはcheckの中身が全てfalse→nullに代わってしまったためbaseを宣言。
もっと効率のいいやり方を探すために明日は他の方のJavaの回答を確認します。

D

私の知っているアルゴリズムでは解けないことだけはわかるため、ここまで。
今後の学習予定としてはDP(動的計画法)が最優先です。

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