关于爱思创OJ平台 150125 题目的题解
这道题目,简单来说就是:
· 在给定的 n n n个数中选择 m m m个数使得随意两个数不存在 k k k倍关系
· 求 m m m的最大值
此题目可以进行简化
对于每个数而言,判断前面集合中是否存在,是这个数的 x x x倍
不存在就可以加入集合,否则不可以加入
但是如果不排序,则会出现反例,例如: 2 和 4
所以,要从大到小排序,但是 x*h 可能会超出 long long范围
为了避免使用高精度,将判断是否存在x*h,改成是否存在y/h
这样就可以了,但是不排序,还是会出现反例,例如:4 2
所以最后,将排序顺序变为从小到大
以下是代码:
#include<bits/stdc++.h>//万能头文件
using namespace std;
long long n,k,a[100010];
set<long long> s;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]%k!=0){
s.insert(a[i]);
ans++;
}
if(a[i]%k==0 && s.count(a[i]/k)==0){
s.insert(a[i]);
ans++;
}
}
cout<<ans;
return 0;
}