Codeforces Round #842 (Div. 2) A~C题解

A. Greatest Convex

题给你一个数k,问你在x<k的情况下满足[x!+(x-1)!]是k的倍数中x的最大值。

你随便带几个数算一下就会发现答案就是k-1。记得考虑特殊值1。

B. Quick Sort

题意就是给你n个数,然后给出k,你每次可以任意移动这n个数中的k个,然后把这k个数排好序放到这个数组的末尾,问你需要使得整个数组升序排好需要操作的最小次数。

在这里举个例,2 1 3 4 5 6 7 8······,我们发现,无论后面是否完全排好,只要前面有没有完成升序的数,那么,后面哪怕已经排好,也需要移动。我们可以找到不需要移动的,然后用总数减去不需要移动的去除k向上取整就好了。

C. Elemental Decompress

题意:给你一个数组,输出两个数组,使得这两个数组相同位置上两数上的最大值符合

max(pi,qi)=ai。并且这两个数组是permutations类型的(无重复,无0,每个数从1自n必须出现一次)。

咱可以排除那些这个数组有数出现超过两次和数组中最大值不是n的,这一定无法满足条件,还有两个1,这是特殊情况,用map就OK。

首先咱记录只出现一次的数,使得这两个数组的这个位置都为这个数,这是一定满足条件,并且简单。

然后咱记录一下出现两个位置上的,就两个数组一边给一个。

对于上面俩数组已经出现的数,咱用俩bool数组去标记一下。

然后就是填充剩下的了,由于这个数组对称,我们可以通过对面那个数去获取,我一开始就是这样由对面那个数不断-1区寻找未被标记的,有就填上,并标记,没有就“NO”了,后来第11个测试TLE了,仔细想想,雀实不行。所以可以先用俩数组去分别对应获取那些还未出现过的数,然后sort,然后咱再去获取对应空位置对面的那个数,仍然sort,然后for循环两个两个数据去对比,小于就填上,否则就“NO”,怎么填上呢,咱可以多用俩数组去标记位置嘛。

记得及时清零和开加速哦。

代码附上:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值