阿里云笔试9.10
AK了,代码搬不出来,就说一下思路。
第一题
给你一个排列p,长度为n,对应的有pos数组表示每个数在排列的哪个位置,再给你一个数组a,一个好的排列指的是对任意i, 。你每次操作可以把交换排列里两个数的位置,问最少要多少次操作才能把排列变得不好。
所有提到的数组长度均为1e5级别。
显然,考虑每个,让它变得不好可以把变成,这样需要操作次,如果,那么还可以把变成,需要操作次。
对每个i计算一下最少操作多少次,取最小值即可。
第二题
给你一个数组,每次操作可以给每个加i,问最少多少次操作,才能把数组变成严格升序。
一眼二分,记得特判一下原来就升序的情况。
考虑到每次操作都是让相邻两个数差减一,应该也可以直接算。
第三题
输出字典序最大的字符串,包含x个字符a,y个字符b,且字符串里同样字符串组成的连续子串长度不超过k。
贪心,每次先check一下之前连续a或者b的数量有没有达到上限,达到了就换另一个。没达到就check能不能加上b,check的方法是看一下加上b之后,剩下的字符数量能不能组成合法的字符串,即 ,如果满足就加上b,不然加上a。