LoginSignup
0
0

More than 1 year has passed since last update.

AtCoderログ:ABC264

Posted at

ABC264に参加しました

今回はA, Bの2完でした。
A:2分
B:20分

今回のコンテストでのレート変動

179→189(灰)

A問題-"atcoder".substr()

単純にsubstrを使用するのみでした。

// 提出コード
int main() {
  string s = "atcoder";
  int l, r;
  cin >> l >> r;

  cout << s.substr(l - 1, (r - l) + 1) << endl;
  return 0;
}

B問題-Nice Grid

完全に沼りました。
簡潔に解こうと思いながらも思いつくことができなかったので早めに自前で盤面を作成して判定するようにすればよかったです。
自身の解答では盤面をループで作成しましたが、このループも一工夫が必要なものなので, 公式解説のように文字列で盤面を定義してしまうのが良かったです。(チェビシェフ距離なんて知りません...)

// 提出コード
int main() {
  int r, c;
  cin >> r >> c;
  string arr[16][16];
  rep3(i, 1, 16) {
    rep3(j, i, 17 - i) {
      if (i % 2 == 1) {
        arr[i][j] = "black";
        arr[j][i] = "black";
        arr[16 - i][j] = "black";
        arr[j][16 - i] = "black";
      } else {
        arr[i][j] = "white";
        arr[j][i] = "white";
        arr[16 - i][j] = "white";
        arr[j][16 - i] = "white";
      }
    }
  }
  cout << arr[r][c] << endl;
  return 0;
}

C問題-Matrix Reducing

大半はこの問題と格闘していました。
解いている途中でbit全探索を使用して解けるであろうことは気づけたのですが最終的な実装までは辿りつきませんでした。
大体こういうのは試験時間が終わるとすっと解けたりしてしまう...

1 3 4 5
6 8 9 10
11 13 14 15
16 18 19 20

を変換して

6 8 9
16 18 19

に出来るかどうかを判定する必要がありました。
H1 * W1 の行列を H2 * W2に変換するので

  • H1ある行から h行(h == H2)
  • W2ある列から w列(w == W2)

抽出することを考えます。
その抽出する行, 列を選ぶ作業にbit全探索を使用しました。

// コンテスト後に提出したコード
int main() {
  int h, w, a, h2, w2, b;
  cin >> h >> w;
  vector<vector<int>> A(h);
  rep(i, h) {
    rep(j, w) {
      cin >> a;
      A[i].push_back(a);
    }
  }
  cin >> h2 >> w2;
  vector<vector<int>> B(h2);
  rep(i, h2) {
    rep(j, w2) {
      cin >> b;
      B[i].push_back(b);
    }
  }

  // bit全探索
  for (int i = 0; i < (1 << h); i++) {
    for (int j = 0; j < (1 << w); j++) {
      vector<int> H, W;
      vector<vector<int>> b(h2);
      for (int k = 0; k < h; k++) if ((i & (1 << k)) == 0) H.push_back(k);
      for (int k = 0; k < w; k++) if ((j & (1 << k)) == 0) W.push_back(k);
      if (H.size() != h2 || W.size() != w2) continue;
      else {
        bool flag = true;
        rep(k, h2) {
          rep(l, w2) {
            if (A[H[k]][W[l]] != B[k][l]) flag = false;
          }
        }
        if (flag) {
          cout << "Yes" << endl;
          return 0;
        }
      }
    }
  }

  cout << "No" << endl;

  return 0;
}

感想

やっぱり本番に練習の100%を出すのは難しいと再認識しました。
とりあえず、典型90問の★2〜3とABC-B問題埋めをやっていこうと思います。

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