P1978 集合

题目描述

集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合。集合有如

下的特性:

•无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的。

•互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。

•确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居

其一,不允许有模棱两可的情况出现。

例如 A = {1, 2, 3} 就是一个集合。我们可以知道, 1 属于 A ,即 1 ∈ A ; 4 不属于 A ,

即 4 ∉ A 。一个集合的大小,就是其中元素的个数。

现在定义一个特殊的 k-集合,要求满足:

•集合的所有特性

•对任意一个该集合内的元素 x ,不存在一个数 y ,使得 y = kx 并且 y 属于该集合。即

集合中的任意一个数,它乘以 k 之后的数都不在这个集合内

给你一个由 n 个不同的数组成的集合,请你从这个集合中找出一个最大的 k-集合。

输入输出格式

输入格式:

第 1 行:两个整数: n 和 k

第 2 行:n 个整数: a[i] 表示给定的集合

输出格式:

第 1 行:一个整数: ans 表示最大的 k-集合的大小

输入输出样例

输入样例#1:

6 2
2 3 6 5 4 10

输出样例#1:

3

说明

提示:在样例所给集合中,找出的最大的 2-集合为 {4, 5, 6}

•对于 30% 的数据: n, k ≤ 100

•对于 40% 的数据: a[i] ≤ 231-1

•对于 70% 的数据: n, k ≤ 5000

•对于 100% 的数据: n, k ≤ 105, a[i] ≤ 263-1

Solution

tips:最近做题总是忘记longlong或者空间开小。。。郁闷

这道题可以排序后从大到小排序,对于每个数x,若k | x,二分找x / k,标记为不能选

由于是从大往小找,可知当前x是否选取影响不到比它大的数

其实从最小开始选也可以

证明:

对于奇数个连续的k的倍数(即 k * a, k * (a + 1), k * (a + 2)...)  可知从非最大(或最小)开始选一定不优于从最大开始选

对于偶数个连续的k的倍数(即 k * a, k * (a + 1),k * (a + 2),k * (a + 3).。。)   无论从哪一个开始选都等价

因此从最大(或最小)的开始选一定最优

但我们从最大开始,因为找的时候会做除法,不会爆long long范围

从最小开始需要做一些防止爆long long的处理

Code

从小开始找的代码:

#include <bits/stdc++.h>
inline void read(long long &x){x = 0;char ch = getchar();while(ch > '9' || ch < '0'){ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();}
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a > b ? b : a;}
inline void swap(long long &a, long long &b){long long tmp = a;a = b;b = tmp;}
const long long INF = 0xfffffffffffffff;const int MAXN = 100000 + 10;
const int MAXK = 100000 + 10;long long num[MAXN],n,k;
bool b[MAXN];//记录哪一些数不能加入,true表示不能加 long long erfen(int l, int r, long long p)
{long long mid;while(l < r){mid = l + ((r - l) >> 1);if(num[mid] >= p)r = mid;else l = mid + 1;}return l;
}long long ans;int main()
{read(n);read(k);for(int i = 1;i <= n;i ++){read(num[i]);}std::sort(num + 1, num + 1 + n);float ma = (float)num[n] / (float)k;for(long long i = 1;i <= n;i ++){if(!b[i]){ans ++;if(num[i] > ma)continue;long long tmp = erfen(i, n, num[i] * k);if(num[tmp]  == num[i] * k)b[tmp] = true; } }printf("%d", ans);return 0;
}

从大开始找的代码:

#include <bits/stdc++.h>
inline void read(long long &x){x = 0;char ch = getchar();while(ch > '9' || ch < '0'){ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();}
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a > b ? b : a;}
inline void swap(long long &a, long long &b){long long tmp = a;a = b;b = tmp;}
const long long INF = 0xfffffffffffffff;const int MAXN = 100000 + 10;
const int MAXK = 100000 + 10;long long num[MAXN],n,k;
bool b[MAXN];//记录哪一些数不能加入,true表示不能加 long long erfen(int l, int r, long long p)
{long long mid;while(l < r){mid = l + ((r - l) >> 1);if(num[mid] >= p)r = mid;else l = mid + 1;}return l;
}long long ans;int main()
{read(n);read(k);for(int i = 1;i <= n;i ++){read(num[i]);}std::sort(num + 1, num + 1 + n);for(long long i = n;i >= 1;i --){if(!b[i]){ans ++;if(num[i] % k == 0){long long tmp = erfen(1, i, num[i] / k);if(num[tmp] * k == num[i])b[tmp] = true; }} }printf("%d", ans);return 0;
}

转载于:https://www.cnblogs.com/huibixiaoxing/p/7015597.html

洛谷P1978 集合 [2017年6月计划 数论08]相关推荐

  1. 洛谷P2073 送花 [2017年6月计划 线段树01]

    P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...

  2. 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...

  3. [洛谷]P1978 集合 (#数学 -1.3)(#STL -1.1)

    题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性:一个集合中,任何 ...

  4. 洛谷P2429 制杖题 [2017年6月计划 数论10]

    P2429 制杖题 题目描述 求不大于 m 的. 质因数集与给定质数集有交集的自然数之和. 输入输出格式 输入格式: 第一行二个整数 n,m. 第二行 n 个整数,表示质数集内的元素 p[i]. 输出 ...

  5. 2019.03.04【ZJOI2018】【BZOJ5213】【洛谷P4339】迷宫(自动机)(数论)

    BZOJ传送门 洛谷传送门 解析: 这道题本质其实是要最小化一个能够接受所有mmm进制下KKK的倍数的自动机. 显然我们有一个方案就是KKK个节点,iii的第jjj条边向(i∗m+j)%K(i*m+j ...

  6. 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]

    P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...

  7. 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]

    P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...

  8. 洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

  9. 洛谷P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]

    P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一 ...

  10. 洛谷 P2415 集合求和【数学公式/模拟】

    给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出 ...

最新文章

  1. 向 Web 开发人员推荐35款 JavaScript 图形图表库
  2. git reset 怎么还原_git reset --hard 操作后的数据恢复
  3. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
  4. Windows Server 2012 新特性:IPAM的配置
  5. struts2.1.6教程二、struts.xml配置及例程
  6. 三折线弹塑性滞回模型matlab,动力弹塑性滞回模型-迈达斯汇总.doc
  7. MySQL入门 (二) : SELECT 基础查询
  8. 工厂模式之消除switch/case语句
  9. Python DearPyGui 常用控件二
  10. 计算机辅助教学:多媒体课件制作教程,多媒体课件制作5步曲!
  11. winform图片操作
  12. 事件发生位置的相对性——思想实验推导狭义相对论(二)
  13. python网络爬虫(web spider)系统化整理总结(一):入门
  14. u盘安装centos8黑屏_求助啊为何装centos7一点安装就黑屏
  15. 【转】从“致加西亚的信”看自行管理
  16. 【愚公系列】华为云系列之DevCloud+ECS+MySQL搭建超级冷笑话网站【开发者专属集市】
  17. 通俗易懂的IP地址、子网掩码、默认网关、DNS服务器
  18. 电大本科计算机上机考试题库,国家开放大学电大计算机操作考试题题库及答案...
  19. 12、【李宏毅机器学习(2017)】Semi-supervised Learning(半监督学习)
  20. 如何有效的杜绝“羊毛党“的薅羊毛行为?

热门文章

  1. [改善Java代码]在equals中使用getClass进行类型判断
  2. 树莓派学习路程No.2 GPIO功能初识 wiringPi安装
  3. distri.lua的web运维工具
  4. [Tomcat]无法使用tomcat6.exe启动服务解决办法
  5. wordpress 更新以及下载插件:wordpress 安装失败:无法创建目录
  6. 最易学和最难学的编程语言Top 5
  7. 重磅!阿里首推的“SpringBoot+Vue全栈项目”有多牛X?
  8. 是的,我开通了小密圈
  9. AndroidDeveloper Weekly No.2
  10. Studio系列教程来啦