传送门

A. Payment Without Change

签到。

B. Minimize the Permutation

题意:
给出一个\(1\)~\(n\)的排列,现在对于一个位置\(i\),可以交换\(a_i,a_{i+1}\)。但要满足每个位置只能交换一次且最多交换\(n-1\)次。
输出操作过后字典序最小的序列。

思路:
直接从后往前每个位置不断贪心考虑即可。
每次扫一遍序列至少会交换一次,所以复杂度为\(O(n^2)\)

C. Platforms Jumping

题意:
一个人位于\(0\)号位置,现在要跳到\(n+1\)号位置,每次跳跃能从\(x\)跳跃到\(x+1\)~\(x+d\)
给出\(m\)块木板的长度,现在要你安排这\(m\)块木板的位置(不改变相对顺序,并且不能重叠),输出最后的方案,或者这个人不能成功到\(n+1\)点。

思路:

  • 判断可行性直接贪心判断,此时在理想情况下,看这个人最远能跳多远;
  • 考虑具体方案时,设木板总长度为\(L\),那么就有\(n-L\)个空隙,这个空隙不能太长,也不能太短。
  • 因此直接根据这个空隙贪心来放木板即可。

详见代码:

D. Binary String Minimizing

题意:
给出一个\(01\)串,现在执行一次操作为:交换两个相连位置的字符。
最多执行\(k\)次操作,输出最终得到的字典序最小串。

思路:
每个\(0\)依次贪心往前移就行,按照前面\(1\)的个数来输出方案。

E. Yet Another Division Into Teams

题意:
\(n\)个学生分组,每组的“值”为最大值减去最小值。
现在要求每个组至少三个同学,问最后所有组的“值”的和的最小值为多少。

思路:

  • 显然学生顺序不影响答案,那么可以排个序。
  • 之后就是一个简单的分组\(dp:dp[i]\)表示将前\(i\)个人进行分组的最小答案。转移时枚举前面的\(j\)进行转移。
  • \(O(n^2)\)显然不能承受,发现前面的\(dp\)值肯定选择最小的,所以用优先队列维护一下即可。

注意一些细节,详细见代码:

F. Equalizing Two Strings

题意:
给出两个字符串,现在可以对两个串任意多次同时翻转长度相同的子串,询问最终能否变为同一子串。

思路:

  • 因为可以任意多次翻转,那么对于任意一次翻转,我们可以等价于多个\(swap\)操作。之后我们就只考虑长度为\(2\)的翻转操作。
  • 首先排除掉某种字符在两个串中个数不相同的情况。
  • 可以发现:若\(t\)串中有两个连续且相同的字符,那么一定合法。因为不断交换这两个不改变串模样。
  • 进一步的推论:若\(t\)串中某个字符出现超过\(1\)次,就合法。
  • 接下来就只考虑长度不超过\(26\)的情况。现在判断\(s\)串能否移动到\(t\)串,我们只需要看两者逆序对个数的差值的奇偶性即可,如果为偶数则合法,否则不合法。

正确性脑补一下应该比较好理解...

12-28 00:57