【洛谷P1338】末日的传说

https://www.luogu.org/problemnew/show/P1338

【题目大意:从1到n的连续自然数,求其逆序对数为m的一个字母序最小的排列。】

最开始的思路是想从逆序对数入手,然后按顺序求出一个个的排列然后找逆序对数==m的那种排列,后来由于我是个蒟蒻...求逆序对数对我来说似乎很难了..只能放弃此题(唉..这大概就是蒟蒻吧..)

蒟蒻不会做,然后搜了一下题解就又感觉学到东西了(常常为学到一点皮毛沾沾自喜然后水水博客..这大概就是蒟蒻喜欢做的事吧.)

【这题应该从字母序最小入手,而不应该从逆序对入手(也可以从逆序对入手,然而我不会求逆序对..emmm...)

字母序怎么样才能最小呢,也就是尽可能把字母序小的数字放在前面,万不得已时再往后放,而对于逆序对数为m这个条件,易知个数为 n 的数的逆序对数最多为 n*(n+1)/2,所以可以根据从当前数字之后的那个数字到末尾数字的总个数 nn 能构造的最大逆序对数(nn+1)*nn/2 是否能>=m入手,也就是如果大于等于m,则表明当前数放在当前位置即可,因为后面的数能构造m个逆序对,而如果小于m,则表明当前位之后的那些数不能构造m对,这时就只能把当前数放到后面来减小m的值了,而也容易想到应该尽可能放到末尾能放的位置(因为这样才能尽可能地减小m,使之后的字母序尽可能小)】

【洛谷P1338】末日的传说

上一篇:Cocos2d-x 3.X手游开发实例详解


下一篇:.NET工作准备--03进阶知识