AtCoder Beginner Contest 093

ABC-の3完でした. D解説読んでもよくわからないので死.
出たコンテストについては何かしら書こうと思ってはいるけど蓄積している.
ABC094とGCJRound1Aも早めに消化したい.

A - abc of ABC

'a', 'b', 'c'が文中に含まれているかどうか確認する.
これ単純にソートして一致するか見ればラクじゃん.

#include <bits/stdc++.h>

using namespace std;

int main(void) {
  string s;
  cin >> s;
  bool a = false, b = false, c = false;
  for(int i = 0; i < 3; i++) {
    if(s[i] == 'a') {
      a = true;
    }
    else if(s[i] == 'b') {
      b = true;
    }
    else if(s[i] == 'c') {
      c = true;
    }
  }
  if(a && b && c) {
    cout << "Yes" << endl;
  }
  else {
    cout << "No" << endl;
  }
}

B - Small and Large Integers

単純に端からk個出力すればよい.
被りが無いようにmapを使っているけどkをb-a+1以下にしているのでその必要はないはず.

#include <bits/stdc++.h>

using namespace std;

int main(void) {
  int a, b, k;
  cin >> a >> b >> k;

  map<int, bool> m;

  if(k > b - a + 1) {
    k = b - a + 1;
  }
  for(int i = 0; i < k; i++) {
    m[a + i] = true;
    cout << a + i << endl;
  }
  for(int i = k - 1; i >= 0; i--) {
    if(!m[b - i]) {
      cout << b - i << endl;
    }
  }
}

C - Same Integers

最小値に2を加える操作を最大値と最小値の差が1になるまで繰り返し, 操作回数をカウントしておく.
最大値と最小値の差が1のとき,

1. 最小値が2つ, 最大値が1つ
2. 最小値が1つ, 最大値が2つ

の2通りになる. 最小値が2つの場合は2つの数字に1を1回加えて終了なので操作回数は1ふえる.
最小値が1つの場合は最小値に2を1回加える → 最小値が2つになるので2つの数字に1を1回加える,
とすると終了なので操作回数は2増える.

#include <bits/stdc++.h>

using namespace std;

int main(void) {
  vector <int> a(3);
  cin >> a[0] >> a[1] >> a[2];

  sort(a.begin(), a.end()); 
  int mx = a[2];
  int mn = a[0];
  int count = 0;
  while(mx - mn > 1) {
    int diff = mx - mn;
    count += diff / 2;
    // cout << "count: " << count << endl; 
    a[0] += diff / 2 * 2;
    // cout << "a[0]: " << a[0] << endl;
    sort(a.begin(), a.end());
    mx = a[2];
    mn = a[0];
  }
  if(a[2] - a[1] == 1) {
    count++;
  }
  else if(a[2] - a[1] == 0 && a[1] - a[0] == 1) {
    count += 2;
  }
  cout << count << endl;
}