Codeforces Round #842 (Div. 2)(A~D)

A. Greatest Convex

给出数字k,输出最大的x,使得x满足大于等于1小于k,且x! + (x - 1)!是k的倍数。

思路:提取公因式得到,(x + 1) * (x - 1)!,由题意知,x + 1可以是k,故x最大是k - 1且一定存在。

AC Code:

B. Quick Sort

给出排列p,每次操作可以选择k个不同的数,将其从排列中拿出并升序排序后放到数组末尾,问最少经过几次操作使得数组升序排序。

思路:对于从1开始的,我们是可以不动的,只计算剩余相对位置不对的数字即可。

AC Code:

C. Elemental Decompress

对于两个长度相等的排列p,q,给出数组c,表示相同位置p与q的最大值,构造满足条件的排列p和q,或者若是不存在满足条件的排列,输出-1。

思路:对于在数组中出现一次的数字,我们可以将对应位置的两个数都赋值为该数;剩余的必定是出现0次和出现两次的数字,且两种数字必定数量相等,出现两次的数字代替了本该出现一次的数字。这样,依照此依据赋值即可,注意大小顺序和no的情况。

AC Code:

D. Lucky Permutation

给出一个排列p,每次可以将两个数字交换位置,问最少经过几次操作使得排列中仅存在一个逆序对。

思路:置换环问题。对于最后会达成的序列,我们可以将其先不管逆序对,即先置换成升序排列的数组,这样在序列中会形成若干个环,通过对环的置换使得数字回到原来的位置。在这种情况下,操作次数是n - cnt,cnt为环的个数。而对于这一个逆序对,很容易想到可以在已经排好的升序序列中交换任意相邻两数。但是,如果在某一个环中存在相邻的两个数,我们可以通过减少一次在该环置换的次数,使得置换完后存在一个逆序对,具体看代码。

AC Code:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值