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 ...
随机推荐
- TCP协议-流量控制
流量控制是通过滑动窗口来实现控制的.使用了坚持定时器,防止发送失败导致死锁.
- Codeforces - 1194D - 1-2-K Game - dp
https://codeforc.es/contest/1194/problem/D 打个n=30的表好像看出了规律. 其实假设k==3,那么 sg[0]=0, sg[1]=mex{sg[0]}=1, ...
- 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行
使用Anaconda5.0.0 1.首选无论你是在cmd键入python,还是在Anaconda Prompt键入python,显示的都是Python3.6.然而在Spyder(tensorflow) ...
- 客户端GUI结构学习总结
这几个月的开发工作主要是关于游戏内GUI的,业务开发之余也时常会看看客户端工程里的GUI系统这一块的代码,这里系统的总结下. 一.GUI树形结构 在GUI中所有的控件都遵循树形结构: 在客户端初始化时 ...
- rdev - 查询/设置内核映像文件的根设备,RAM 磁盘大小或视频模式
总览 SYNOPSIS rdev [ -rvh ] [ -o offset ] [ image [ value [ offset ] ] ] rdev [ -o offset ] [ image [ ...
- Matomo(Piwik)安装说明-----------基于LNPM环境
Matomo(Piwik)安装说明 安装前环境检查 Piwik要求PHP版本高于PHP5.5(选用PHP7.2) Piwik需要pdo和pdo_mysql或mysqli支持(选用mysqli) Piw ...
- Python元类之由浅入深
前言 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...
- java插件提示安全设定高,不能加载解决方法
当不可信小应用程序或应用程序在 Web 浏览器中运行时,我应当如何控制? 本文适用于: Java 版本: 7.0, 8.0 通过 Java 控制面板设置安全级别 在 Java 控制面板中,单击 Sec ...
- canvas 图片反色
代码实例: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <tit ...
- hdu 3183 rmq+鸽巢原理
题目大意: 给你一个数字字符串序列,给你要求删掉的数字个数m,删掉m个数使的剩下的数字字符串的之最小.并输出这个数字: 基本思路; 这题解法有很多,贪心,rmq都可以,这里选择rmq,因为很久没有写r ...