题目描述:给定 n 个数字构成的一个多重集合:请求出,其中有多少元素不能被任意一个在集合中的其他元素整除?多重集合是指允许出现多个相等元素的集合。
Solution 1:暴力
去枚举每个数,并寻找哪个符合要求,时间:
Solution 2:小优化
Solution 1的基础上排序,一找到就break,跟暴utibn力时间差不多,就是常数很小而已
Solution 3:往后遍历
枚举每个数a[i],枚举第二个乘数j,(a[i]*j<=a[n]),然后查看有没有那个a[i]*j的值
时间:
时间靠数据!也不行
Solution 4(AC):
枚举每个数,去分别枚举数的所有约数,并查找有没有这个数
拆分时间:
枚举约数,可以用做
查找数
1.暴力
2.二分
3.ct[]直接记录(map)
最终时间
因为数据没有那么坑人,所以能过
特别注意一下,如果有多个相同的数,则此点必不是满足要求
当有值为1时,看mp[1]是否为1,直接得出相应的答案
上代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int n, a[N], mx;
unordered_map<int, int> mp;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
mx = max(mx, a[i]);
++mp[a[i]];
}
if (mp[1]) {
if (mp[1] == 1) puts("1");
else puts("0");
return 0;
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (mp[a[i]] > 1) continue;
bool t = 0;
for (int j = 2; j * j <= a[i]; ++j) {
if (a[i] % j) continue;
if (mp[j] || mp[a[i] / j]) {
t = 1;
break;
}
}
ans += (!t);
}
printf("%d", ans);
return 0;
}