3403. 题解【NOIP2013模拟】数列变换 (Standard IO)
先看题目:
Description
现在,小 X想知道 f (f (f (f ([1,2,3,⋯,n],2),3),⋯),n)的结果。
Input
Output
Sample Input
4
Sample Output
4 2 3 1 【样例说明】
f ([1,2,3,4],2) = [2,1,4,3]
f ([2,1,4,3],3) = [1,4,2,3](3单独被分在一组,移动到组的最后一位,仍然是3)
f ([1,4,2,3],4) = [4,2,3,1]
Data Constraint
对于100%的数据,1≤ n ≤10^6。
【思路详解】:
首先,我们看到这一题时的第一反应一定是打一个朴素算法(懒人暴力),这一题的正解碰巧就是模拟+剪枝
我们先按照题意来写出一个模拟,分为每个阶段now,now的初始值为2(阶段指的是要把这个序列分成几组),每一个阶段都将这个序列分为now组,然后将每一组的第一个元素放到这一组的尾部。时间复杂度大概为O(n^2),非常好打,这样打60分肯定是没问题的,但是100分是怎么拿的呢,如果这一题想要AC就一定要做出一些剪枝才行,我们看这一题的空间:524288 KB,非常的大,所以我们本着以空间换取时间的想法进行优化。
我们发现,纯暴力慢的原因主要是在把每一组的开头元素移到组尾后这个组的其他元素会往前移,这时我们用的是for循环一个一个换位置,这当然很慢,所以我们着手在这方面进行优化。可以发现每一个组的元素都要放到队尾,那我们把这一组的第一个元素放到下一组的第一个位置,然后下一组第一个元素放到下下一组的第一位,这样我们就可以不用在移动元素了,只需要在最后一组时多开一个空间将最后一组第一个元素放进去就好了,这样我们一次分组多开一个空间,我们一共需要分组n-1次,我们就开两倍空间不就好了,这样就可以将时间复杂度降到O(nlogn)就可以AC了。
下面上代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,now,lo,hi,a[]={},bot; //2倍空间
void change(){ //进行分组
bot=a[lo]; //暂时存放
for(int i=lo;i<=hi;i+=now){
if(i+now>hi){
a[++hi]=bot;
lo++;
break;
}
swap(bot,a[i+now]); //交换
}
}
int main(){
cin>>n;
now=;
lo=,hi=n;//用lo,hi标记现在的开头和结尾元素位置
for(int i=;i<=n;i++) a[i]=i;
while(now<=n){
change();
now++;
}
for(int i=lo;i<=hi;i++) cout<<a[i]<<" ";
}
总结:这是一道大水题,细心就能AC(当然还得有脑子,所以我WA了40分)。
3403. 题解【NOIP2013模拟】数列变换 (Standard IO)的更多相关文章
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...
- JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)
3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Det ...
- JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)
3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB De ...
- JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)
470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿
3388. [NOIP2013模拟]绿豆蛙的归宿 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limi ...
- JZOJ 3463. 【NOIP2013模拟联考5】军训
3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms Memory Limits: 262144 KB Deta ...
随机推荐
- 转 router-view 的理解
主要是构建 SPA (单页应用) 时,方便渲染你指定路由对应的组件.你可以 router-view 当做是一个容器,它渲染的组件是你使用 vue-router 指定的.比如: 视图层: <div ...
- [Codeforces 280D]k-Maximum Subsequence Sum(线段树)
[Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不 ...
- python学习第十二天列表的循环,排序,统计操作方法
python列表最重要的列表的循环,任何有序列表离不开循环,列表的循环 for in range等关键词,还有列表排序,正序,倒序,还有列表每个元素的最大,最小,统计元素的个数等. 1,列表的循环 ...
- linux的各种安装配置和编译首页
VMware与Centos系统安装 https://www.cnblogs.com/LLBFWH/articles/10991478.html centos7安装python3 以及tab补全功能 h ...
- C#使用Process启动exe程序,不弹出控制台窗口的方法
背景:使用wkhtmltopdf工具将html转换成pdf时,这个工具在进行转换时会弹出命令行窗口显示转换过程,但是在项目运行时弹出服务器突然弹出控制台窗口会很奇怪,尤其是当转换多个时.解决这个问题 ...
- Solr的学习使用之(二)schema.xml等配置文件的解析
上一篇文章已经讲解了如何部署Solr,部署是部署完了,可是总觉得心里空空的,没底,里面有N多配置文件,比如schema.xml.solrConfig.xml.solr.xml and so on……都 ...
- parse_str()和http_build_query()的使用
<?php $_html = array(); $_html['action1'] = 'action1'; $_html['action2'] = 'action2'; echo http_b ...
- idea模块搭建新手党常见错误
一.搭建java和web模块会出现的错误(此篇以分布式模块为例) 1.创建空工程 1.点击file ,在弹出的窗口左侧选项中在最后有一个Empty Project选项.此处就是创建空工程. 2.在此空 ...
- Linux就该这么学11学习笔记
参考链接:https://i.cnblogs.com/EditPosts.aspx?opt=1 文件传输协议 一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式 ...
- iview中表单重置无效
<Form>组件的model属性必须与表单组件的v-model属性的绑定对象一致 <FormItem>的prop属性要与表单组件v-model绑定的对象的字段相对应 <F ...