michimani.net

AtCoder Beginner Contest 039 の A/B/C 問題の解法 #ABC039

2024-01-22

AtCoder Beginner Contest 039 の A/B/C 問題の解法。

実装はこちら atcoder/abc/001-100/039 · michimani/atcoder

A - 高橋直体

A - 高橋直体

表面積なので、直方体の 6 面の面積を計算して出力する。直方体の 6 面は 2 面ずつペアになるので、

の 3 つの積を計算して合計したものを 2 倍すればよい。

#include <iostream>

using namespace std;
using ui = unsigned int;

int main()
{
  ui a, b, c;
  cin >> a >> b >> c;

  cout << (a * b + b * c + c * a) * 2 << endl;
  return 0;
}

提出 #49583355 - AtCoder Beginner Contest 039

B - エージェント高橋君

B - エージェント高橋君

\(X = N^4\) なので \(N = \sqrt[4]{X}\) となる。\(\sqrt[4]{X}\) を計算するには sqrt を 2 回使うか、もしくは pow(x, 1.0 / 4.0) を使う。この問題においてはどちらも実行時間に大差はない。

#include <iostream>
#include <cmath>

using namespace std;
using ui = unsigned int;

int main()
{
  ui x;
  cin >> x;

  cout << ui(sqrt(sqrt(x))) << endl;
  return 0;
}

提出 #49583355 - AtCoder Beginner Contest 039

C - ピアニスト高橋君

C - ピアニスト高橋君

“ド” から始まる鍵盤を表す文字列 \(s\) と、それに対応する文字列を用意しておく。

\(s\) の \(i\) 番目の文字を高橋くんがいる鍵盤として、与えられた \(S\) の最初の 12 文字が \(i\) 番目の文字列から始まる \(s\) と一致するかを調べる。具体的には、 \(s_{i \mod 12}\) から \(s_{i + 11 \mod 12}\) までが全て \(S_j (0\leq j \leq 11)\) と一致するかどうか \(0 \leq i \leq 11 \) について調べる。一致したときの \(i\) に対応する音階の文字列が答えとなる。

#include <iostream>
#include <vector>

using namespace std;
using ui = unsigned int;

int main()
{
  const string p = "WBWBWWBWBWBW";
  const ui ps = ui(p.length());
  const vector<string> o = {"Do", "Do", "Re", "Re", "Mi", "Fa", "Fa", "So", "So", "La", "La", "Si"};

  string s;
  cin >> s;

  bool found = false;
  ui f = 0;
  while (!found)
  {
    bool ok = true;
    for (ui i = 0; i < ps; i++)
    {
      if (p[(i + f) % ps] != s[i])
      {
        ok = false;
        break;
      }
    }

    if (ok)
    {
      found = true;
      break;
    }

    f++;
  }

  cout << o[(f + ps) % ps] << endl;
  return 0;
}

提出 #49579145 - AtCoder Beginner Contest 039


comments powered by Disqus