えんじにあ備忘録

脱よわよわエンジニアを目指すブログ

AtCoder Beginner Contest 305 に参加しました&反省会

AtCoder Beginner Contest 305 の振り返り

  • A, B問題を解くことができた
  • A問題:Nが5で割り切れない場合、Nを含む区間の起点・終点とNとの差を比較する
  • B問題:A地点を起点に各点までの距離を計算し、点p,qの距離を求める
  • C問題:当マスの周囲のマスにどれだけクッキーがあるのかをカウントする
  • D問題:

A問題

atcoder.jp

解説*1から

  • 全体を 5で割って考えると、「 x= \frac{N}{5}に最も近い整数を求める」ことになるます。これは xを小数部分で四捨五入することで求められます
  • 答えは「 N5で割ったあと四捨五入して整数にし、それを 5倍にしたもの」になります
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int N;
    cin >> N;
    cout << int(round(N / 5.0)) * 5 << endl;
    return 0;
}

B問題

atcoder.jp
- 点 A,B,C,D,E,F,Gを点 0,1,2,3,4,5,6に置き換えます。この置き換えは字をASCIIコードに置き換える操作によります。p-'A' -  Aを数直線上のx=0の地点とみなして、BからGまでの座標を計算すると順にx=3,4,8,9,14,23になります。
実装例

#include <iostream>
using namespace std;

int main() {
  char p, q;
  cin >> p >> q;
  int e[] = {0, 3, 4, 8, 9, 14, 23};
  cout << abs(e[p - 'A'] - e[q - 'A']) << endl;
}

C問題

atcoder.jp

解説*2から

  • 上下左右に隣接するマスの#の数に注目します。すぬけ君がクッキーを食べる前、クッキーがあるマスでは、この数は2以上です(角の部分では2、辺の部分では3、内側は4)。いっぽう、クッキーがない場所では、この値は高々1です(クッキーのある長方形に隣接している部分では1、それ以外は0)。すぬけ君がクッキーを食べた後、そのマスは#から.になりますが、隣接する#の数は変わりません。また、もとから.であった場所で、隣接する#の数が増えることもありません。結局、上に書いた条件を満たすのは、すぬけ君がクッキーを食べた場所だけです。