michimani.net

AtCoder Beginner Contest 206(Sponsored by Panasonic) #ABC206

2024-01-05

AtCoder Beginner Contest 206(Sponsored by Panasonic) の A/B/C 問題の解法。

実装はこちら atcoder/abc/201-300/206 · michimani/atcoder

A - Maxi-Buying

A - Maxi-Buying

\(N\) を unsigned int として受け取り、 \(1.08\) 倍ではなく \(108\) 倍する。その後 \(100\) で割ることで、 \(1.08\) 倍して小数点以下を切り捨てた状態と同じになる。あとはこの値と \(206\) を比較して結果を出力する。

#include <iostream>

using namespace std;
using ui = unsigned int;

int main()
{
  ui n;
  cin >> n;
  n *= 108;

  const ui t = 206;

  if (n / 100 < t)
  {
    cout << "Yay!" << endl;
  }
  else if (n / 100 == t)
  {
    cout << "so-so" << endl;
  }
  else
  {
    cout << ":(" << endl;
  }

  return 0;
}

提出 #49025550 - AtCoder Beginner Contest 206(Sponsored by Panasonic)

B - Savings

B - Savings

\(i\) 日目の合計貯金額を \(S_i\) とすると、 \(S_1 = 1, S_i = S_{i-1} + i (i \geq 2)\) となる。問題の条件であれば \(i\) を順に足していって \(S_i\) が初めて \(N\) を超えるときの \(i\) を求めればよい。

#include <iostream>

using namespace std;
using ui = unsigned int;

ui add(ui &t, ui d, ui sum)
{
  if (sum >= t)
  {
    return d - 1;
  }

  return add(t, d + 1, sum + d);
}

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

  cout << add(n, 0, 0) << endl;
  return 0;
}

提出 #49025699 - AtCoder Beginner Contest 206(Sponsored by Panasonic)

C - Swappable

C - Swappable

\( 1\leq i \lt j \leq N\) を満たす \((i,j)\) の組み合わせは、 \(1 ,\dots, N\) から 2 つの数を選ぶ組み合わせと同じ数だけ存在する。この組み合わせの数は \({}_N C_2 = \frac{N(N-1)}{2}\) である。

\({}_N C_2\) は \(A_i \neq A_j \) を満たさないものも含まれているので、 \(A_i = A_j\) を満たすものをここから除外する。 \(A_i = A_j\) を満たすものは、 \(A_i\) が同じ数となる個数を \(k\) とすると、\({}_k C_2\) である。

どの数が複数個現れるかは \(A_i\) を受け付けるときに map<unsigned int, unsigned int> m で記録していく。

入力をすべて受け付けたあと、 m の各要素に対して \(value\) が \(2\) 以上のものに対して \({}_{value} C_2\) を計算して、 \({}_N C_2\) から引いていく。残った値が答えとなる。

#include <iostream>
#include <map>

using namespace std;
using ull = unsigned long long;

ull nc2(ull n)
{
  return (n * (n - 1)) / 2;
}

int main()
{
  ull n = 0;
  cin >> n;

  map<ull, ull> m;
  for (ull i = 0; i < n; i++)
  {
    ull a;
    cin >> a;

    if (m.count(a) == 0)
    {
      m[a] = 1;
    }
    else
    {
      m[a]++;
    }
  }

  ull ans = nc2(n);
  auto it = m.begin();
  while (it != m.end())
  {
    if (it->second > 1)
    {
      ans -= nc2(it->second);
    }
    it++;
  }

  cout << ans << endl;
  return 0;
}

提出 #49035808 - AtCoder Beginner Contest 206(Sponsored by Panasonic)


comments powered by Disqus