誤読して大きく出遅れた...
問題概要
個の整数
があたえられる。これを何個かのグループに分けて、各グループについて「グループ内のすべての整数がグループ内の最小値で割り切れる」という条件を満たすようにしたい。
これを実現するためのグループ数の最小値を求めよ。
制約
考えたこと
まず のうちの最小値
に着目すると、
はいずれかのグループにおいて最小となる。そのグループについて考えてみよう。
そうすると で割り切れるやつは全部一つのグループにしてしまってよいことがわかる (理由:
で割り切れるやつを残しておくメリットはないため)。
で割り切れるやつをグループとしてまとめてしまうと、
で割り切れないやつが残る。残ったやつで同様の操作を繰り返せば OK。
とても模範的な Greedy 問題だと思う。
#include <iostream> #include <set> using namespace std; int main() { int N; cin >> N; set<long long> s; for (int i = 0; i < N; ++i) { long long a; cin >> a; s.insert(a); } int res = 0; while (!s.empty()) { long long v = *s.begin(); for (auto it = s.begin(); it != s.end();) { if ((*it) % v == 0) { it = s.erase(it); } else ++it; } ++res; } cout << res << endl; }