AtCoder ABC118

引き続き、ABCの3完だった。いい調子だと思う。

A問題

問題文通り。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>

#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int a,b; cin>>a>>b;
  int ans = 0;
  if(b % a == 0) {
    ans = a + b;
  } else {
    ans = b - a;
  }
  cout << ans << endl;
}

B問題

こういう「各データの登場頻度を記録し解答を求める」タイプは、連想配列の出番である。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>

#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N, M; cin>>N>>M;
  map<int,int> dict; // kind, love
  for(int i=0; i<N; i++) {
    int K; cin>>K;
    for(int j=0; j<K; j++) {
      int a; cin>>a;
      dict[a]++;
    }
  }

  int ans = 0;
  for(auto p: dict) {
    if(p.second == N) {
      ans++;
    }
  }

  cout << ans << endl;
}

C問題

最初は最大値を最小値で割った時の余りを使って、さらに各数値を割っていって・・・ってトンチンカンなことやってた。
「すべて偶数の時の答えが2で、奇数が混じってたら1で、同じ数値しかなかったらその数値が答え、ってなんだよ???」
「あ、最大公約数か」
gcdライブラリ、ネットからパクっててよかった。C++17からじゃないと標準ライブラリにないらしいからな。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <cassert>
#include <memory>
#include <stack>
#include <set>
#include <map>

#define INF 1000000000
#define MOD 1000000007
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

// 最大公約数 greate common diviser
template<typename T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N; cin>>N;
  vector<int> A(N);
  for(int i=0; i<N; i++) {
    cin>>A[i];
  }

  int ans = INF;
  for(int i=0; i<N-1; i++) {
    ans = min(ans, gcd<int>(A[i], A[i+1]));
  }

  cout << ans << endl;
}

D問題

マッチを使い切らなければならないが、できるだけ多くの数値を並べられるように(その方が桁数が増えるから)使い切る方法がまったくわからん。 いずれは超えなければならない壁ではあるのだけど・・・。

追記

「greate」ってなんやねん。「greatest」やろ、あほか。おれのことやけど。