题意:看输出的意思是n和n*k是一类,求最多有几类,用了set,还有一种方法是二分,不然数据太大
#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 200005;
long long arr[MAXN];
int n,k;
int main(){
while (scanf("%d%d",&n,&k) != EOF){
set<long long>s;
s.clear();
for (int i = 0; i < n; i++)
scanf("%lld",&arr[i]);
sort(arr,arr+n);
int sum = 0;
for (int i = 0; i < n; i++){
if (s.count(arr[i]) == 0){
sum++;
s.insert(arr[i]*k);
}
}
printf("%d\n",sum);
}
return 0;
}
二分:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
long long arr[MAXN];
int vis[MAXN];
int main(){
int n,k;
while (scanf("%d%d",&n,&k) != EOF){
for (int i = 0; i < n; i++)
scanf("%lld",&arr[i]);
memset(vis,0,sizeof(vis));
sort(arr,arr+n);
int ans = n;
for (int i = 0; i < n; i++){
if (!vis[i]){
long long a = arr[i]*k;
if (a > arr[n-1])
continue;
int left = i+1,right = n-1;
while (left <= right){
int mid = (left+right) / 2;
if (arr[mid] > a)
right = mid-1;
else if (arr[mid] < a)
left = mid+1;
else {
vis[mid] = 1;
ans--;
break;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}