CodeForces 275C k-Multiple Free Set(二分)
题目链接:CodeForces 275C k-Multiple Free Set
题目大意:给出n和k,然后给出元素个数为n的集合num,现在要从num集合中挑选出尽量多的元素组成新的集合,新的集合的要求是集合中不存在元素x , y(x < y)使得x * k = y,输出最大的元素个数。
解题思路:将num数组排序,对应每个数值的num[i] * k进行二分搜索,如果搜索到,cnt--。
这里有两个坑点:
1、因为x < y,所以要考虑k = 1的情况。
2、数据
5 2 1 2 3 4 5,自己去发现问题吧。
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;const int N = 100005;int n, cnt, vis[N];long long k, num[N];void search(long long c) {int l = -1, r = n;while (l < r) {int mid = (l + r) / 2;if (num[mid] < c) l = mid;else if (num[mid] > c) r = mid;else { if (c / k < num[mid]) {vis[mid] = 1;cnt--; }return; }if (l == r - 1) return;}}int main () {scanf("%d%lld", &n, &k);cnt = n;for (int i = 0; i < n; i++)scanf("%lld", &num[i]);memset(vis, 0, sizeof(vis));sort(num, num + n);if (k != 1)for (int i = 0; i < n; i++) {if (vis[i]) continue;search(num[i] * k);}printf("%d\n", cnt);return 0;}