14数字涂色
1 题目描述
2 代码
#include "iostream"
#include "vector"
#include "algorithm"
#include "unordered_map"
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
int numMax = arr.back();
unordered_map<int, int> mem;
int count = 0;
for (int i = 0; i < arr.size(); i++) {
int num = arr[i];
if(mem[num] == 0) {
count++;
for (int j = 1; num * j <= numMax; j++) {
if (mem[num * j] == 0) {
mem[num * j] = num;
}
}
} else {
continue;
}
}
cout << count << endl;
return 0;
}
3 代码2
#include "iostream"
#include "vector"
#include "algorithm"
#include "unordered_map"
using namespace std;
class UnionFind {
public:
UnionFind(int n) {
parent.resize(n);
rank.resize(n);
for (int i = 0; i < parent.size(); i++) {
parent[i] = i;
}
return;
}
int find(int x) {
if (parent[x] == x) {
return x;
}
int root = find(parent[x]);
parent[x] = root;
return root;
}
void unit(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
}
private:
vector<int> parent;
vector<int> rank;
};
vector<int> getPrimeFactors(int num) {
vector<int> res;
for (int i = 2; i <= num; i++) {
for (;num % i == 0;) {
res.push_back(i);
num = num / i;
}
}
return res;
}
void mPrint(vector<int> arr) {
for (int num : arr) {
cout << num << " ";
}
cout << endl;
return;
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
UnionFind uf(101);
vector<int> res;
for (int i = 0; i < arr.size(); i++) {
res = getPrimeFactors(arr[i]);
for (int j = 0; j < res.size(); j++) {
uf.unit(arr[i], res[j]);
}
}
unordered_map<int, int> mem;
for (int i = 0; i < arr.size(); i++) {
mem[uf.find(arr[i])]++;
}
cout << mem.size() << endl;
return 0;
}