2018ECNA Difference[时空复杂度]
题干
代码和解释
本题给出一个数列的第一个数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[时空复杂度]的更多相关文章
- Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度
Fibonacci Sequence 维基百科 \(F(n) = F(n-1)+F(n-2)\),其中 \(F(0)=0, F(1)=1\),即该数列由 0 和 1 开始,之后的数字由相邻的前两项相加 ...
- 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...
- o(1), o(n), o(logn), o(nlogn)算法复杂度
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...
- 常用数据结构的功能及复杂度总结(OI)
不定长数组 维护一个序列 在末尾插入/删除均摊O(1) 任意位置插入O(n) 指定位置查询/修改O(1) 空间O(n) 链表 维护一个序列 定位到第i个位置O(n) 在任意位置(已定位到该位置)插入/ ...
- Luogu P5416 [CTSC2016]时空旅行
第一次写线段树分治的题目,没想到是道这么毒的题233 首先发现题目里的\((x,y,z,c)\)就是在放屁,只有\((x,c)\)是有用的 因此我们可以把题意转化为,在某一个时间节点上,求出所有元素的 ...
- LeetCode(164)Maximum Gap
题目 Given an unsorted array, find the maximum difference between the successive elements in its sorte ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- ListView之多种类型Item
一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...
- [转]完美洗牌(Perfect Shuffle)问题
[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md ...
随机推荐
- swift - 开心一刻
let array = ["one", "two", "three", "four", "five" ...
- mac php thinkphp5 验证码报错 Call to undefined function think\captcha\imagettftext()
百度一下,是GD库里缺少了freetype支持,然后各种拓展的方法都试了半天,php-v里都生效了,phpinfo里还是不生效,原来是各种文章里都缺少了最关键的一步,修改Apache的配置(我使用的是 ...
- springboot异常处理方式
一.异常处理思路 异常捕获的是unchecked型异常,因为checked异常在代码中年已经处理过,当然是在使用try-catch处理.这里首先使用ExceptionHandler捕获全局异常,这样如 ...
- Linux 部署 YUM 仓库
本篇主要写了怎么搭建自定义的YUM源,在一个拥有大量本地网络的主机环境中,可以减少对外网的依赖. Server 安装 vsftp 包 [root@server ~]# yum install vsft ...
- css三种引入方式以及其优先级的说法
css 三种引入方式 方式一:行间式 1.在标签头部的style属性内 2.属性值满足css语法 3.属性值用key:value形式赋值,value具有单位 4.属性值之间用 分号 : ...
- spring cloud微服务实战教程/pdf/视频/百度云资源
资源站:http://www.supan.vip 点击进入直接查找资源: http://www.supan.vip/spring%20cloud微服务实战 <Spring Cloud微服务实战& ...
- Beta冲刺第3次
一.团队成员的学号姓名列表 学号 姓名 201731103226 翟仕佶 201731062517 曾中杰 201731062424 杨模 201731062632 邓高虎 201731062624 ...
- python基础笔记-列表
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可. def main(): ...
- Ofbiz项目学习——阶段性小结——插入数据
一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...