山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

AtCoder 300点の問題を解き直す その3

今までは Ruby で解いていましたが、C++に変更しました。

ABC 064 C - Colorful Leaderboard

数学パズルっぽい問題です。

コード

#include <bits/stdc++.h>
using namespace std;

int main(){
  cin.tie(0);
    ios::sync_with_stdio(false);
  int N;
  cin >> N;
  int a[N];
  for(int i = 0; i < N; i++){
    cin >> a[i];
  }
  int b[9]{};
  for(int i : a){
    int idx = i / 400;
    if(idx >= 8){
      idx = 8;
      b[idx]++;
    }else{
      b[idx] = 1;
    }
  }
  int Min = 0;
  for(int i = 0; i < 8; i++){
    Min += b[i];
  }
  int Max;
  if(Min == 0){
    Min = 1;
    b[8]--;
  }
  Max = Min + b[8];
  cout << Min << " " << Max << "\n";
  return 0;
}

ABC 070 C - Multiple Clocks

最小公倍数の問題です。オーバーフローに注意します。

コード

#include <bits/stdc++.h>
using namespace std;

long gcd(long a, long b){
  if(a > b) return gcd(b, a);
  long k = b % a;
  if(k == 0) return a;
  return gcd(a, k);
}
long lcm(long a, long b){
  return a / gcd(a, b) * b;
}
int main(){
  cin.tie(0);
    ios::sync_with_stdio(false);
  int N;
  cin >> N;
  long T[N];
  for(int i = 0; i < N; i++){
    cin >> T[i];
  }
  long l = T[0];
  for(int i = 1; i < N; i++){
    l = lcm(l, T[i]);
  }
  cout << l <<"\n";
  return 0;
}

ABC 073 C - Write and Erase

ハッシュに関する問題です。

コード

#include <bits/stdc++.h>
using namespace std;

int main(){
  cin.tie(0);
    ios::sync_with_stdio(false);
  int N, A;
  cin >> N;
  set<int> s;
  while(N--){
    cin >> A;
    if(s.count(A)){
      s.erase(A);
    }else{
      s.insert(A);
    }
  }
  cout << s.size() << "\n";
  return 0;
}