michimani.net

AtCoder Beginner Contest 137 #ABC137

2023-12-18

AtCoder Beginner Contest 137 の A/B/C 問題の解説。

実装はこちら atcoder/abc/101-200/137 · michimani/atcoder

A - +-x

A - +-x

特筆する点はなし。

提出 #48625713 - AtCoder Beginner Contest 137

B - One Clue

B - One Clue

特筆する点はなし。黒が確定している座標を含める形で前後に \(K\) ずらした範囲が答えなので、 \([X - (K-1), X + (K-1)]\) の値を出力する。

#include <iostream>

using namespace std;

int main()
{
  int k, x;
  cin >> k >> x;

  int cnt = 0;
  for (int i = x - (k - 1); i <= x + (k - 1); i++)
  {
    if (cnt > 0)
    {
      cout << " ";
    }
    cout << i;
    cnt++;
  }

  cout << endl;
  return 0;
}

提出 #48625637 - AtCoder Beginner Contest 137

C - Green Bin

C - Green Bin

入力された各文字列をソートして、ソートした文字列をキーとして、 map<string, unsigned long long> に登録し、値をインクリメントする。

この値は同一の文字列が出現した回数なので、そこから 2 つを選ぶ組み合わせ、つまり \( {}_n C_2 \) の合計値を出せば良い。

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

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

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

  map<string, unsigned long long> s_cnt;
  for (unsigned int i = 0; i < n; i++)
  {
    string s;
    cin >> s;

    sort(s.begin(), s.end());
    s_cnt[s]++;
  }

  unsigned long long ans = 0;

  auto iter = s_cnt.begin();
  while (iter != s_cnt.end())
  {
    ans += nc2(iter->second);
    iter++;
  }

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

提出 #48625194 - AtCoder Beginner Contest 137


comments powered by Disqus