首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

CodeForces 275C k-Multiple Free Set(2分)

2013-10-18 
CodeForces 275C k-Multiple Free Set(二分)题目链接:CodeForces 275C k-Multiple Free Set题目大意:给出n

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;}


热点排行