NOIP模拟测试29 七十和十七
60分算法:
设f[i]为把i个数排序的次数和,那么便可以从f[i-1]转移过来。
相当于先把i-1个排好序,之后在最后的位置插入一个数x,
如果x==i则计数器不加,否则考虑x如何跳到它本来的位置。
设g[i]为i这个数从序列最后的位置跳到i需要的步数(g[1]=1)
首先它要跳到第一个位置,步数为1,
接着我们发现a[1]的位置到了2,所以需要把1跳到原来的位置,步数为g[1]
之后2同理,步数为g[2]
...
综上:$ g[i]=g[1]+g[2]+....g[i-1]+1; $
化简:$ g[i]=2^(i-1);
有了g[],便可以简单的求f[]了
$ f[i]=f[i-1]*i+fac[i-1]*g[k] (1=<k<i) $
时间复杂度$ O(n^2) $
100分算法
g[]是个等比数列,可以$ O(1) $求出前缀和,总时间复杂度$ O(n) $