けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 333 B - Pentagon (6Q, 灰色, 200 点)

ちょっとした算数・数学の問題!

問題概要

考えたこと

A, B, C, D, E をそれぞれ 0, 1, 2, 3, 4 と対応させよう(0 始まりにするのがコツ)。このとき、対角線の長さは、対角線の両端に対応する数値の差で表すことができる。

たとえば、線分 BD の長さは、1 と 3 の差で「2」と表せる。線分の長さを表す数値は 1, 2, 3, 4 の 4 通りがありうるが、次のように整理できる。

  • 長さ「1」と、長さ「4」は等しい
  • 長さ「2」と、長さ「3」は等しい

これをもとに、次のように判定できる。


  • 線分  S_{1}S_{2} の長さを表す数値を  s とする(実際の長さではない)
  • 線分  S_{1}S_{2} の長さを表す数値を  t とする(実際の長さではない)

このとき、

  •  s = t または  s + t = 5 のとき:"Yes"
  • そうでないとき:"No"

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    char s1, s2, t1, t2;
    cin >> s1 >> s2 >> t1 >> t2;

    int ds = max(s1, s2) - min(s1, s2);
    int dt = max(t1, t2) - min(t1, t2);
    if (ds == dt || ds + dt == 5) cout << "Yes" << endl;
    else cout << "No" << endl;
}