纪中游记(三)
20190804
写在前面的话
今天的考试,脑中只有暴力。
T0
初
暴力模拟计算过程(移动第一个数->移动中间的数),结果只有六十分。
复
究其原因,就是因为移动中间数位的操作浪费了时间,导致时间复杂度为O(n2)
那么如何省去中间的操作呢?再读一遍题,可以发现其实所谓的计算过程可以转化为拿这一组的第一个元素替换下一组的第一个元素,这样时间复杂度就降至O(nlogn)。
但是,你一定发现了其中的问题:替换操作会导致整个数组向后移位。
其实也很简单只要把数组开至2倍,再添加一个变量记录移位数就可以了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a[2000005]; 4 int main() 5 { 6 scanf("%d",&n); 7 for(int i=1;i<=n;i++) 8 { 9 a[i]=a[i-1]+1; 10 } 11 int jc=0; 12 for(int i=2;i<=n;i++) 13 { 14 int last=a[1+jc],lastt=0; 15 for(int j=1;j<=n/i;j++) 16 { 17 lastt=a[(i*j)+1+jc]; 18 a[(i*j)+1+jc]=last; 19 last=lastt; 20 } 21 if(n%i>=1) 22 { 23 a[n+1+jc]=last; 24 } 25 jc++; 26 } 27 for(int i=1;i<=n;i++) 28 { 29 printf("%d ",a[i+jc]); 30 } 31 return 0; 32 }
终
转化很重要!
T1