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) $

 

posted @ 2019-08-22 11:57  ATHOSD  阅读(117)  评论(0编辑  收藏  举报