zoukankan      html  css  js  c++  java
  • 互斥的数(贪心)

    互斥的数

    题目描述:
    有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。
    输入描述:
    输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)。接下来一行包含N个不同正整数ai(1<=ai<=10^9)。
    输出描述:
    输出一行表示最大的满足要求的子集的元素个数。
    样例输入:
    4 2
    1 2 3 4
    样例输出:
    3
    思路:
    贪心思想+map实现
    找出不互质的数的集合,就是把互斥的数删去,那么当有两个互斥的数时,删掉哪一个呢?删掉后面的。为什么?当删掉后面的数时,这个数前面的会入选,这个数后面的与它互斥的数也会入选,因为每个数都是不同的。
    举个例子:
    3 2
    1 2 4
    当枚举到1时 会发现1和2有冲突
    我们毫不犹豫的删去2 这样4才能也被选入
    样例2
    4 2
    1 2 4 8
    当我们枚举到1时 还是发现1和2有冲突
    还是删去2 这样4能被选入 而8必须被删去

    #include<iostream>
    #include<algorithm>
    #include<map>
    using namespace std;
    const int maxn=100010;
    int n,m,ans,a[maxn];
    map<int,int> hash;
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        sort(a+1,a+n+1);
        for(int i=1;i<=n;i++)
        if(!hash[a[i]])
        {
            hash[a[i]*m]=1;
            ans++;
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    Account group in ERP and its mapping relationship with CRM partner group
    错误消息Number not in interval XXX when downloading
    错误消息Form of address 0001 not designated for organization
    Algorithm类介绍(core)
    梯度下降与随机梯度下降
    反思
    绘图: matplotlib核心剖析
    ORB
    SIFT
    Harris角点
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070953.html
Copyright © 2011-2022 走看看