C++代码:有一个长为n1=n=1000的序列序列上的元素两两不同你需要用最少的操作步骤翻转这个序列。每次操作你需要给出三个数ijk1=i=jk=n交换序列中下表属于ij的元素与下标属于j+1k的元素例如对于长为7的序列1234567进行操作i=2j=4k=6后序列变为1562347给定n你需要输出最少的操作步骤并输出每一步的具体操作保证对于所有输入的n均至少存在一个有限步内的合法操作。
思路:贪心+模拟
因为每次操作都是交换两个区间,所以可以考虑贪心,每次找到最长的降序序列,将其翻转成升序,直到整个序列变成升序为止。
具体实现时,可以维护一个指针p,表示当前已经处理好的序列的末尾位置,每次找到从p开始的最长的降序序列,将其翻转成升序,并更新p的位置。
代码:
原文地址: http://www.cveoy.top/t/topic/fQZi 著作权归作者所有。请勿转载和采集!