题干



代码和解释

本题给出一个数列的第一个数A(1),要求找出m第一次出现(直接出现在数列中或是数列中某两项的差的绝对值)在这个数列的第几步中。数列递推公式:A(n+1)=A(n)+min,min是最大的从1开始未出现在数列中且未出现在数列中某两项的差值的绝对值中的整数。

第一遍做此题时,我定义了一个结构体node存储每一步时数列的值以及这项与之前所有项的差值,并定义了这个结构体类型的vector来存储所有项及差值,同时定义了一个整型数组bul存储每一个数是否出现过的信息;



第二遍删去了结构体,用一个整数存数列中某项的值,并定义了一个整型的vector存储所有项,定义了一个数组diffs存储数列中某项与之前所有项值的差值,同时定义了一个整型数组bul存储每一个数是否出现过的信息;



这两次都以Runtime Error失败,在老师的指导下,我知道了自己第二遍的代码中bul和diffs两个数组占内存大小已达1.6个g之多(int型4个字节,(410^8)4个字节),严重超出内存要求,老师建议我使用char型数组代替bul,同样可以达到要求,且char型只占1个字节。而我也发现,diffs这个用于存储差值的数组并没有存在的必要,删去之。第三遍代码上交后报错为time limit exceeded,这时我想到最近刚学了list添加和删除元素要比vector快,于是将v改成list型,成功ac了。



下面是最终的c++代码

#include<iostream>
#include<list>
#include<string.h>
using namespace std;
char bul[200000005];//因为数组太大,放到全局变量可以解决这个问题。使用char型可以解决int型超出内存的问题!
int main()
{
int tv;//temporary value
list<int> v;
int A1;
long long m;
int i,j,f;
int min;
int tmp;
int lastk;
list<int>::iterator it;
list<int>::iterator it2;
while(~scanf("%d%lld",&A1,&m)){
v.clear();//初始化
tv=A1;
v.push_back(tv);
if(m==A1){
printf("%d\n",1);
break;
}
min=A1;
memset(bul,'0',sizeof(bul));//初始化
bul[A1]='1';//第一个值有了
f=0;
long long k = 1;//k存新的未出现的数
while(f==0){
//先是添加,只要跟v的上一位比较即可
lastk=k;
//寻找min的值
while(1){
if(bul[k]=='0'){
min=k;
k++;
break;
}
k++;
}
it=v.end();
it--;//表示比v.size()少一位的大小
tv=*it+min;
bul[tv]='1';//这个值有了
bul[min]='1';// for(it2=v.begin();it2!=it;it2++){//这里不能用小于号,只能用不等号
bul[tv-*it2]='1';//新出现的差值
}
v.push_back(tv); //再是查找是否有m,只要找v最新的一位即可
if(bul[m]=='1'){
printf("%d\n",v.size());
break;
}
}
}
return 0;
}

解决本题使我认识到了做题时要注意考虑内存和时间,以及一些其他小教训,比如定义大的数组应该定义为全局变量,在结构体中定义数组要指明数组大小等。

2018ECNA Difference[时空复杂度]的更多相关文章

  1. Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度

    Fibonacci Sequence 维基百科 \(F(n) = F(n-1)+F(n-2)\),其中 \(F(0)=0, F(1)=1\),即该数列由 0 和 1 开始,之后的数字由相邻的前两项相加 ...

  2. 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  3. o(1), o(n), o(logn), o(nlogn)算法复杂度

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  4. 常用数据结构的功能及复杂度总结(OI)

    不定长数组 维护一个序列 在末尾插入/删除均摊O(1) 任意位置插入O(n) 指定位置查询/修改O(1) 空间O(n) 链表 维护一个序列 定位到第i个位置O(n) 在任意位置(已定位到该位置)插入/ ...

  5. Luogu P5416 [CTSC2016]时空旅行

    第一次写线段树分治的题目,没想到是道这么毒的题233 首先发现题目里的\((x,y,z,c)\)就是在放屁,只有\((x,c)\)是有用的 因此我们可以把题意转化为,在某一个时间节点上,求出所有元素的 ...

  6. LeetCode(164)Maximum Gap

    题目 Given an unsorted array, find the maximum difference between the successive elements in its sorte ...

  7. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  8. ListView之多种类型Item

    一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...

  9. [转]完美洗牌(Perfect Shuffle)问题

    [转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md ...

随机推荐

  1. 【转载】C#通过遍历DataTable的列获取所有列名

    在C#中的Datatable数据变量的操作过程中,可以通过遍历DataTable的所有列对象Columns属性,来获取DataTable中的所有列名信息,DataTable中所有列的对象信息都存储在D ...

  2. 从 Vue 的视角学 React(一)—— 项目搭建

    虽然 Vue 在国内一家独大,但在全球范围内,React 依然是最流行的前端框架 最近和一些朋友聊天,发现很多项目都选择了 React 技术栈,而且公司的新项目也决定使用 React 我一直以来都是走 ...

  3. Java学习之:Spring的扩展配置

    1.在配置文件applicationContext.xml中,引入相关的配置文件方式: 2.使用Jndi数据源的方式改造配置文件applicationContext.xml: 3.注释配置文件appl ...

  4. android studio打印

    写入打印语句 System.out.println("hello furong"); 添加打印过滤 指定过滤规则 Filter Name:随便写 Log Tag:日志标志 Log ...

  5. python笔记--------numpy

    numpy.zeros() 功能:创建零矩阵 numpy.mean(a, axis, dtype, out,keepdims ) 功能:对数据求均值. 参数介绍: a:数据,一般为矩阵 axis:未设 ...

  6. Java SpringBoot 手记

    SpringBoot Git:https://github.com/spring-projects/spring-boot Maven (mvn)环境配置: 下载地址:http://maven.apa ...

  7. 将python图片转为二进制文本的实例

    https://www.jb51.net/article/155342.htm 写在最前面: 我在研究机器学习的过程中,给的数据集是手写数字图片被处理后的由0,1表达的txt文件,今天写一写关于图片转 ...

  8. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.qingmu.Customer

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity pas ...

  9. 20180523模拟赛T1——前缀?

    (a.cpp/c/pas) Time Limit:1 Sec Memory Limit:128 MB 简化版题意 jyt毒瘤,写了超长的题面,要看完整题面的翻到最后-- 老太太认为一个长度为 N 的仅 ...

  10. python 使用 requests 做 http 请求

    1. get import requests # 最简单的get请求 r = requests.get(url) print(r.status_code) print(r.json()) # url ...