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 ...
随机推荐
- Python模块之pdfkit
1.安装依赖 pip install python-docx #Python下的Microsoft Word 2007工具 pip install PyPDF2 #Python下的PDF工具 pip ...
- Codeforces 1093D(染色+组合数学)
题面 传送门 题目大意:给出一个无向图,每个节点可以填1,2,3三个数中的一个 问有多少种填数方案,使两个相邻节点的数之和为奇数 分析 如果图中有奇环,一定无解 我们对图黑白染色,由于图可能不联通,记 ...
- BUUCTF--reverse2
测试文件:https://buuoj.cn/files/ef0881fc76e5bcd756b554874ef99bec/e8722e94-93d7-45d5-aa06-a7aa26ce01a1.ra ...
- 攻防世界--getit
测试文件:https://adworld.xctf.org.cn/media/task/attachments/8ef2f7ef55c240418f84b3c514a7a28a 准备 得知 64位文件 ...
- JSON:结构化数据格式
JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...
- tensorflow的阶、形状、数据类型
张量的阶.形状.数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 ...
- 工欲善其事,必先利其器——React Native的 IDE
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yayayaya20122012/article/details/51119801之前的文章中,我们已 ...
- 使用Fiddler为满足某些特定格式的网络请求返回mock响应
假设我想对本地Java程序发起的调用SAP Hybris web service https://jerrywang.com:9002/rest/v2/electronics/users/ 这个网络请 ...
- cocos2D-X 打包
{ //首先有java jdk,android sdk,android ndk //用android studio import //匹配gradle 的版本 有些gradle可能下载不下来,不用慌 ...
- vue项目中echarts使用渐变效果报错echarts is not defined
解决办法:在当前单组件中在引用一次