问题描述

有一个可重集合,一开始只有一个元素 0。

你可以进行若干轮操作,每轮你需要对集合中每个元素 x 执行以下三种操作之一:

  1. 将 x 变为 x+1;
  2. 选择两个非负整数 y,z 满足 y+z=x ,将 x 变为这两个元素;
  3. 什么都不做。

给出一个最终的集合,求至少经过几轮才能得到这个集合。

输入格式

第一行一个正整数 n,表示最终集合的大小。

第二行 n 个非负整数 ai,表示最终集合中的元素。

输出格式

输出一个整数,表示答案。

样例输入

5

0 0 0 3 3

样例输出

解析

不妨倒过来思考,考虑如何通过将一个数减一和合并两个数使目标集合变成只有0的集合。对于任意两个数\(a\)和\(b\),如果将两个数分开减为0再合并,那么操作次数为\(max(a,b)+1\),而先合并再减小为0的操作次数为\(a+b+1\)。显然第一种更优。推广开来,我们的最优策略即为每轮先和并所有的0,再把不是0的减1,直到只剩一个0为止。

具体实现也很简单。每次把0的数量减半,同时减小长度。预处理每个数在哪一轮会减为0,并在那一轮最后加上新的0的个数。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 1000002
using namespace std;
int n,i,a[N],cnt[N],num,ans;
int main()
{
freopen("set.in","r",stdin);
freopen("set.out","w",stdout);
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) cnt[a[i]]++;
num=cnt[0];
while(n>1){
ans++;
n-=num/2;
num=(num+1)/2;
num+=cnt[ans];
}
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}

Test 6.24 T2 集合的更多相关文章

  1. 24.Collection集合

    1.Collection集合 1.1数组和集合的区别[理解] 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用 ...

  2. Day18_集合第四天

    1.Map集合成员方法(掌握) 增加功能 V put(K key, V value) 当key在集合中不存在时,添加元素:当key在集合存在时候,替换元素 删除功能 void clear 清除所有键值 ...

  3. java集合框架(Collections Framework)

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. java 入土--集合详解

    java 集合 集合是对象的容器,实现了对对象的常用的操作,类似数组功能. 和数组的区别: 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 使用时需要导入类 Col ...

  5. mongodb MongoDB 聚合 group(转)

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...

  6. mongodb聚合 group

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...

  7. Python3 进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  8. python使用笔记26--多线程、多进程

    1.概念 线程.进程 进程是资源的集合,也就是一个程序 线程是一个程序运行的最小单位 线程是在进程里面的 默认,一个进程就只有一个线程 一个电脑有几核CPU就只能同时运行几个任务,比如4核CPU只能同 ...

  9. Spring 源码学习

    spring最核心的理念是IOC,包括AOP也要屈居第二,那么IOC到底是什么呢,四个字,控制反转 一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们 ...

随机推荐

  1. ORACLE DG 库参数db_file_name_convert和log_file_name_convert的作用

    https://www.cnblogs.com/xqzt/p/5089826.html ORACLE DG 库参数db_file_name_convert和log_file_name_convert的 ...

  2. Idea导入项目详解

    1.点击Import Project选择项目所在目录 2.Import Project选项区别: 1)如果选择Create project from existing sources选项, 则你只能导 ...

  3. AtomicReference 源码分析

    AtomicReference AtomicReference 能解决什么问题?什么时候使用 AtomicReference? 1)AtomicReference 可以原子更新引用对象. 2)comp ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字

    不想被序列化的成员变量用 transient修饰 age加上static关键字 反序列化age就读取不到正确的值了

  5. 《Using Databases with Python》Week1 Object Oriented Python 课堂笔记

    Coursera课程<Using Databases with Python> 密歇根大学 Charles Severance Week1 Object Oriented Python U ...

  6. jmeter逻辑控制详解(1)

    逻辑控制器 Jmeter提供了多种逻辑控制器,下面进行讲解说明: 1.Simple Controller 简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可以将某些请求归集在一个简单控 ...

  7. pyAudioAnalysis-audioFeatureExtraction 错误纠正

    1. TypeError: mfccInitFilterBanks() takes 2 positional arguments but 7 were given The issue In the f ...

  8. [Git] 002 初识 Git 与 GitHub 之加入文件 第一弹

    在 GitHub 的 UI 界面使用 Git 往仓库里加文件 第一弹 1. 点击右上方的 Create new file 2. 在左上方填入文件名,若有后缀,记得加上 3. 页面跳转,此时已有两个文件 ...

  9. FastDFS搭建单机图片服务器(一)

    防丢失转载:https://blog.csdn.net/MissEel/article/details/80856194 根据 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署 和 ...

  10. 如何在CentOS 7上安装Yarn

    Yarn是与npm兼容的JavaScript软件包管理器,可帮助自动化安装,更新,配置和删除npm软件包的过程. 它的创建是为了解决npm的一系列问题,例如通过并行化操作并减少与网络连接有关的错误来加 ...