题目要求尽量最大的字典序,且每个元素最多只能交换两次。字典序是从前面开始比较的,因此我们也要从前面开始贪心,枚举到第i个的时候,记录max为当前元素,然后往下考虑终止条件就是他的次数足够换到第i个数(j-i<=cnt[j])并记录max,然后从max元素的下标连续交换到i即可
#include <bits/stdc++.h>
using namespace std;
#define N 200005
有 N 个人排成一列,从左到右依次编号为位置 1,2,…,N。每个人身上带有一个互不相同的整数号码,所有号码恰好构成 1 到 N 的一个排列。
你可以反复进行如下操作:选择相邻的两人交换位置。每人初始拥有 2 点精力,每参与一次交换(无论主动还是被动),参与交换的两人各自消耗 1 点精力。当某人的精力降为 0 后,他不能再参与任何交换。
现在希望你通过若干次合法交换,使得最终得到的队列在如下比较规则下尽可能大:从左到右依次比较两个序列对应位置的号码,第一个出现不同号码的位置上,号码较大的那个序列视为更大。
你需要求出能够得到的最大序列。
约束条件
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.