Description - 问题描述

集合M的定义如下:

  • 1是M中的元素
  • 如果x是M中的元素,那么2x+1和4x+5都是M中的元素

那么,集合M中,最小的n个数是哪些?

Input - 输入数据

一个整数n(1<=n<=100 000)

Output - 输出数据

n个从小到大的整数,空格分隔。

  仔细一分析便可推知最后需要输出的数一定是单调递增的。在当时做这题的时候,旁边的gxy同学直接从1开始暴力枚举所有的奇数(2x+1和4x+5肯定是一个奇数),然后判断和前面的数是否构成2x+1或4x+5的关系,是的话就输出,否则便continue,这样的话算法复杂度就达到了O(n^2),最后还是有一个点无法通过。那么,是否还有更好的方法呢?

  事实上,由前面的单调递增可以知道:假如我们用一个数组来保存输出的数,那么这个数组肯定是2x+1产生的数再并上4x+5产生的数。这样一来也就明了了只要我们定义一个a队列来保存2x+1产生的数,用一个b队列保存4x+5产生的数。每次将a的队头与b的队头进行比较,则会出现3种情况:(A)a队头>b队头  (B)a队头=b队头  (C)a队头<b队头  这时只需要将较小者送人x来执行下一次的2x+1和4x+5,同时也不要忘记将x输出。在经过多方的查证后,我才得以知道这是使用了单调队列的思想,下面给出百度里给它的定义以有助于大家的理解:单调队列,即单调的队列。使用频率不高,但在有些程序中会有非同寻常的作用。(大概就是诸如这类的题目吧)

举例

不妨用一个问题来说明单调队列的作用和操作:
不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。
最直接的方法:普通队列实现缓存数组。
进队出队都是O(1),一次查询需要遍历当前队列的所有元素,故O(n)。
  好了,接下来给出代码,仅供参考:
 #include<iostream>
using namespace std;
const int maxn=+;
int a[maxn],b[maxn];
int x=,n,total=;
int front1=,front2=,tail1=,tail2=;
int main()
{
cin>>n;
while(total<=n)
{
if(total==n)
cout<<x;
else
cout<<x<<' '; tail1++;
a[tail1]=*x+; tail2++;
b[tail2]=*x+; if(a[front1]>b[front2])
{
x=b[front2];
front2++; }
else
{
if(a[front2]<b[front2])
{
x=a[front1];
front1++;
}
else
{
x=a[front1];
front1++;
front2++;
}
}
total++;
}
return ;
}

最后,欢迎大家的指教。

yzoi2223集合构造的详细解法的更多相关文章

  1. yzoi2226最小步数的详细解法

    Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字. ...

  2. Springmvc构造RESTful详细讲解

    Rest介绍 /blog/1 HTTP GET => 得到id = 1的blog/blog/1 HTTP DELETE => 删除 id = 1的blog/blog/1 HTTP PUT ...

  3. yzoi1777倒水问题的详细解法

    Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在 ...

  4. Java 集合系列Stack详细介绍(源码解析)和使用示例

    Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现 ...

  5. 2个集合比较——最高效解法(Java实现)

    优点:时间复杂度为O(n)级别: 缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多. 理论分析: 两个集合的元素之和以及之积相同则,这两个集合相等.(前提是两个集合的数量一致) 证 ...

  6. Java集合框架体系详细梳理,含面试知识点。

    一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ...

  7. 泛型集合List的详细用法

    命名空间:   System.Collections.Generic List<T>类是 ArrayList 类的泛型等效类.    该类使用大小可 按需动态增加 的数组实现 IList& ...

  8. [LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)

    给定中序遍历inorder和后序遍历postorder, 请构造出二叉树. 算法思路: 设后序遍历为po, 中序遍历为io. 首先取出po的最后一个节点作为根节点, 同时将这个节点入stn栈; 随后比 ...

  9. 蓝桥杯(Java方法、详细解法分析)基础练习 阶乘计算

    问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 6 5 样例输出 00720 数据规模和约 ...

随机推荐

  1. DB2_001_MQT

    MQT stands for Materialed Query Table.它的定义是建立在查询结果之上的,把动态查询的结果放到表中,表中的数据随着基础表中数据的变化而变化.当基础表中的数据变化时,M ...

  2. ACM1877_又一版A+B

    .这道题与2031极为相似. #include<iostream> using namespace std; void fun(int n,int r) { ]="0123456 ...

  3. [原]ubuntu下制作openstack-havana源

    ubuntu下可以用apt-mirror下载openstack的源: 1.安装apt-mirror: apt-get install apt-mirror 2.配置/etc/apt/mirror.li ...

  4. linux0.12 编译过程

    感谢这篇文章的作者:    http://www.cnblogs.com/strugglesometimes/p/4231359.html 编译是个很蛋疼的事情,本想把linux0.12在bochs上 ...

  5. 深度学习Matlab DeepLearningToolBox 工具包最常见错误解决办法\

    deeplearningtoolbox  下载链接github : https://github.com/rasmusbergpalm/DeepLearnToolbox,只需要解压到matlab当前工 ...

  6. 【设计模式 - 14】之命令模式(Command)

    1      模式简介 命令模式的定义: 命令模式将命令封装成对象,从而使调用一个命令变为调用一个对象的指定方法. 命令模式的优点: 1)        降低了系统耦合度: 2)        新的命 ...

  7. 【Android - V】之Toolbar的使用

    Toolbar是Android V7包中的一个控件,用来代替Action Bar作为界面的头部标题栏布局.Toolbar相对于Action Bar的特点是更加灵活,可以显示在任何位置. 首先先来看To ...

  8. 你的Jsp页面有黄×么,有黄色问号么?Multiple annotations found at this line: - Invalid location of tag (form). - No

    jsp页面有黄色问号代表我们的html标签不符合规范 对于很多人拿到页面美工给的页面,有时候很多都有黄色的问号. 为什么会这样呢? Multiple annotations found at this ...

  9. MapObject shape数据操作

    利用MO 的GeoDataset  .DataConnection  Recordset 进行数据操作 在MO中.使用GeoDataset对象和DataConnection 对象来连接和读取地理数据. ...

  10. C# 保存窗口为图片(保存纵断面图)

    源代码例如以下: #region 保存纵断面截图 private void button_save_Click(object sender , EventArgs e) { SaveFileDialo ...