Codeforces.GYM101612E.Equal Numbers(贪心)
\(Description\)
给定\(n\)个数,每次可以将任意一个数乘上任意一个正整数。
求\(k\)次操作后,数列中数的种类最少可以是多少。对每个\(0\leq k\leq n\)输出答案。
\(n\leq 3\times10^5,a_i\leq10^6\)。
\(Solution\)
有两种贪心策略,一是每次找一个出现次数最少的数,把它变成所有数的LCM;二是找一个出现次数最少,且它的某个倍数存在于原数列里的数,将它变成它的这个倍数。
对两种情况取\(\min\)即可。
//93ms 8600KB
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+3;
int tm[N];
std::vector<int> va,vb;
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
freopen("equal.in","r",stdin);
freopen("equal.out","w",stdout);
int n=read();
for(int i=1; i<=n; ++i) ++tm[read()];
for(int i=1; i<N; ++i)
if(tm[i])
{
va.push_back(tm[i]);//只关心次数
for(int j=i+i; j<N; j+=i)
if(tm[j]) {vb.push_back(tm[i]); break;}
}
std::sort(va.begin(),va.end());
std::sort(vb.begin(),vb.end());
int tmp=va.size();
va.push_back(1e8), vb.push_back(1e8);
std::vector<int>::iterator pa=va.begin(),pb=vb.begin();
for(int i=0,sa=0,sb=0,a=0,b=0; i<=n; ++i)
{
while(sa+*pa<=i) sa+=*pa++, ++a;
while(sb+*pb<=i) sb+=*pb++, ++b;
printf("%d ",tmp-std::max(a-1,b));
}
return 0;
}
Codeforces.GYM101612E.Equal Numbers(贪心)的更多相关文章
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- Codeforces 878 E. Numbers on the blackboard
Codeforces 878 E. Numbers on the blackboard 解题思路 有一种最优策略是每次选择最后面一个大于等于 \(0\) 的元素进行合并,这样做完以后相当于给这个元素乘 ...
- Codeforces 55D. Beautiful numbers(数位DP,离散化)
Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得 ...
- Codeforces gym101612 E.Equal Numbers(贪心)
传送:http://codeforces.com/gym/101612 题意:给出一个大小为n的序列a[i],每次选其中一个数乘以一个正整数,问进行k步操作后最少剩下多少种数字,输出0≤k≤n,所有的 ...
- codeforces Gym 100338E Numbers (贪心,实现)
题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...
- Codeforces 1065C Make It Equal (差分+贪心)
题意:n个塔,第i个塔由$h_i$个cube组成,每次可以切去某高度h以上的最多k个cube,问你最少切多少次,可以让所有塔高度相等 k>=n, n<=2e5 思路:差分统计每个高度i有的 ...
- Codeforces Round #479 (Div. 3) C. Less or Equal (排序,贪心)
题意:有一个长度为\(n\)的序列,要求在\([1,10^9]\)中找一个\(x\),使得序列中恰好\(k\)个数满足\(\le x\).如果找不到\(x\),输出\(-1\). 题解:先对这个序列排 ...
随机推荐
- CSS在项目中常用的属性总结
1.媒体查询 2.如何快速生成适配各种浏览器的属性. 3.全面进军移动app开发.
- 【转】Python之文件读写
[转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...
- Pytorch 资料汇总(持续更新)
1. Pytorch 论坛/网站 PyTorch 中文网 python优先的深度学习框架 Pytorch中文文档 Pythrch-CN文档地址 PyTorch 基礎篇 2. Pytorch 书籍 深度 ...
- UML和模式应用5:细化阶段(5)---系统顺序图
1.前言 系统顺序图(SSD)是为阐述系统相关的输入和输出事件而快速.简单的创建的制品,它们是操作契约和对象设计的输入. SSD展示了直接与系统交互的外部参与者.系统(作为黑盒)以及由参与者发起的系统 ...
- [转] bss段、data段、text段
1.前言 一个程序本质上都是由 BSS 段.DATA段.TEXT段三个组成的. 本文主要分编译时和运行时分别对 对data段 bss段 text段 堆 栈作一简要说明 2. 程序编译时概念说明 程序与 ...
- Python 优雅获取本机 IP 方法【转】
转自:https://www.cnblogs.com/lfxiao/p/9672975.html 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 ...
- centos环境无法安装paramiko的问题解决
yum install openssl-devel yum install pycrypto yum install python-devel 全部安装完毕后执行pip install paramik ...
- c# LINQ 使用
linq是个好东西,让开发人员省时省力.很多人可能只知道怎么使用, 对它没有全面深入的了解.所谓磨刀不误砍柴工,今天就来学习下. 一.与LINQ有关的语言特性 1.扩展方法 在System.Linq命 ...
- mpVue小程序全栈开发
1.微信小程序,mpVue和wepy的对比 2. 3.es6中关于数组的一些方法 <script> let arr = [,,,] // 遍历 arr.forEach(v => { ...
- PHP 闭包
一.闭包基本用法闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数.比如下面的例子: // 定义一个闭包,并把它赋给变量 $f $f = function () { return 7; } ...