题干



代码和解释

本题给出一个数列的第一个数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. Java 流程控制 之 分支结构——条件判断语句

    一.判断语句 1.判断语句1-- 单 if 语句(单分支结构) 语法格式: if(条件表达式){ 语句体; }  执行流程: 首先判断条件表达式看其结果是 true 还是 false: 如果是 tru ...

  2. HTTP协议中GET和POST

    1. get 它用于获取信息,注意,他只是获取.查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了 2. pos ...

  3. window10体验terminal

    体验window-terminal(preview),很不错可以直接登录服务器通过ssh 01.打开store 02.搜索terminal 03.体验ssh主机 04.很爽,可以ctrl + 鼠标滚轮 ...

  4. box-cox解读

    可以额外参考资料:https://blog.csdn.net/sinat_26917383/article/details/77864582,http://www.dataguru.cn/articl ...

  5. [Doxygen].Docygen使用

    转自:https://www.cnblogs.com/chenyang920/p/5732643.html Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文 ...

  6. CentOS7.0 内核(3.10.0-123.el7.x86_64)bug导致KVM物理机重启

    一.问题描述 服务器硬件:DELL R720 系统版本:CentOS7.0 内核版本:3.10.0-123.el7.x86_64 故障现象:偶尔会重启 二.问题原因 经查看dmesg日志发现是kern ...

  7. FRP 中文文档

    https://github.com/fatedier/frp/blob/master/README_zh.md README | 中文文档 frp 是一个可用于内网穿透的高性能的反向代理应用,支持 ...

  8. 一个兼容IE7\IE8,H5的多功能视频播放器,H5视频播放器兼容Flash视频播放器

    这里记录一个视频播放器,免费可适当修改:名称:ckplayer视频播放器(免费) 官网地址:http://www.ckplayer.com/ 下载地址:http://www.ckplayer.com/ ...

  9. 玩转Spring--消失的事务@Transactional

    消失的事务 端午节前,组内在讨论一个问题: 一个没有加@Transactional注解的方法,去调用一个加了@Transactional的方法,会不会产生事务? 文字苍白,还是用代码说话. 先写一个@ ...

  10. MySQL 快速删除大量数据

    千万级数据量 方案1. 直接使用delete 因delete执行速度与索引量成正比,若表中索引量较多,使用delete会耗费数小时甚至数天的时间   方案2. (1)创建临时表,表结构与原表结构相同 ...