CodeForces #795 Div2 | 题解ABC

这题很简单,如你所见,要想相邻的两个元素之和是偶数,那么只有两种情况:
①偶数 + 偶数
②奇数 + 奇数
于是我们就知道,我们只需要把所有的元素的奇偶性统一就好了。
又因为题中问的是最少的操作次数,那我们事先需要看一看给定的数组里是奇数多还是偶数多即可。
太有趣了,没活儿不仅可以咬打火机,还可以换鞋子玩,这世界太奇妙。
仔细读一读题我们就会发现,如果想存在一次可行的交换,那我们原来穿最大号鞋子的人必须得穿比他的号码大于等于的鞋子,
但是因为没有比他的号码更大的了,所以只能穿和他一样的号码的,以此类推,我们会发现每个人只能穿和自己一样的号的鞋子(这倒也合理)。
于是我们只需要统计原数组中是不是所有的数字的出现次数都大于1就好了,如果没有,则不存在,直接输出-1。
此外,我们需要知道每个数字都在原来的第几号出现,所以我们用一个map <int, vector<int>>来记录是非常不错的选择,vector用来记录原来的序号。
最后只需要把每个vector里的所有除了最后一个序号+1,最后一个序号换成第零个即可。
这个题目的话,首先要看出:F(s) = 10 × s1 + 11 × s2 + 11 × s3 … 11 × sn − 1 + 1 × sn
我们只需要贪心的先让首尾变小,再将余下的操作次数给中间的部分即可(考虑到首尾的减小贡献最大)。