思路+码一共约45分种,最终得分七十分,我知道自己错在哪,好像不怎么能改得了,但混混分应该还行,先占个坑写写思路吧。
首先我的思路基础,一是冒泡排序进行一次交换代表消去一个逆序对。输入的v代表要消去的逆序对的个数。
二是由于贪心思想,我们优先选取字典序低的字母。
三是我看用例猜测,bbaa、ccbbaa,这种连续两个的应该是要尽量多【当然看了下别人好像三个也行,猜测光荣阵亡。但这点可以看看能不能完善】
在以上的思路基础下,
于是认为,结果字符串应该是类似于那样的结构,再加上fghj这种之后的字母排成的前缀。
例如输入为100时的字符串
jihgfeeddccbbaa
观察字符串,可得所需逆序对数量v=前缀逆序对数+后缀逆序对数+后缀字母数量*前缀字母数量。
其中前缀指的是前面的乱七八糟部分,后缀指的是成对出现的数字。
而由于这样的字符串其实由后缀决定,所以我选择枚举后缀所拥有的字母种类数,最终取得最小值。
所以我们首先任务就是以字母种数创造后缀字符串数组,记录每种字母种类数的值。【仔细想,这里似乎不需要创建数组,之后实时算不知道行不行?】
对于后缀的字符串,我选用了抽象的定义和创造方法。
以”aa“、”bbaa“这种为一个doubleNode,包含它内部的逆序对数和它所拥有的字母数。并且doubleNode数列内部满足递推公式。
这里其实可以根据n的数据范围优化array的大小。这地方还没写。
typedef struct doubleNode{
int eleNum