zoukankan      html  css  js  c++  java
  • Codeforces Round #168 (Div. 2) C. kMultiple Free Set(二分查找)

    C. k-Multiple Free Set
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    A k-multiple free set is a set of integers where there is no pair of integers where one is equal to another integer multiplied by k. That is, there are no two integers x and y (x < y) from the set, such that y = x·k.

    You're given a set of n distinct positive integers. Your task is to find the size of it's largest k-multiple free subset.

    Input

    The first line of the input contains two integers n and k (1 ≤ n ≤ 105, 1 ≤ k ≤ 109). The next line contains a list of n distinct positive integers a1, a2, ..., an (1 ≤ ai ≤ 109).

    All the numbers in the lines are separated by single spaces.

    Output

    On the only line of the output print the size of the largest k-multiple free subset of {a1, a2, ..., an}.

    Sample test(s)
    Input
    6 2
    2 3 6 5 4 10
    Output
    3
    Note

    In the sample input one of the possible maximum 2-multiple free subsets is {4, 5, 6}.

    数据需要用64位long long去存储。

    先对原始数据排序,遍历数组,若某元素的k倍数存在,则要判断是保留该元素抑或他的k倍数,事实上,总是保留该元素,然后标记它的k倍数,之后不再检测。

    在判断k倍数是否存在时,使用顺序查找会超时,使用二分查找即可。

    AC Code:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 
     6 using namespace std;
     7 
     8 int n, k;
     9 long long a[100005];
    10 bool tag[100005];
    11 
    12 int main()
    13 {
    14     while(scanf("%d %d", &n, &k) != EOF)
    15     {
    16         for(int i = 0; i < n; i++) scanf("%I64d", a + i);
    17         memset(tag, false, sizeof(tag));
    18         sort(a, a + n);
    19         int ans = n;
    20         for(int i = 0; i < n; i++)
    21         {
    22             if(!tag[i])
    23             {
    24                 long long p = a[i] * k;
    25                 if(p > a[n-1]) continue;
    26                 int low = i + 1, high = n - 1, mid;
    27                 while(low <= high)
    28                 {
    29                     mid = (low + high) / 2;
    30                     if(a[mid] > p) high = mid - 1;
    31                     else if(a[mid] < p) low = mid + 1;
    32                     else
    33                     {
    34                         tag[mid] = true;
    35                         ans--;
    36                         break;
    37                     }
    38                 }
    39             }
    40         }
    41         printf("%d\n", ans);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    elform 校验
    深入理解ES6系列
    【数据结构&算法】10串基础&KMP算法源码
    【数据结构&算法】13赫夫曼树&赫夫曼编码
    【RTOS】FreeRTOS中的任务堆栈溢出检测机制
    【数据结构&算法】11树基础&二叉树遍历
    【环境】解决linux与windows之间的复制粘贴
    【数据结构&算法】09队列概念&参考源码
    【网络基础】内网IP与外网IP
    【数据结构&算法】12线索二叉树
  • 原文地址:https://www.cnblogs.com/cszlg/p/2923097.html
Copyright © 2011-2022 走看看