Codeforces Edu.44 CF985A Chess Placing

题目链接:http://codeforces.com/contest/985/problem/A

题目大意:给出一个\([1,n]\)的范围,给出\(n/2\)个数,每次可以对任意一个数进行加一减一操作(数字之间不能穿过)。要求把所有数都变成奇数或偶数且各不相同。

错误做法

一开始他说数字之间不能穿过,我以为和蚂蚁(POJ1852)很像,就是不用考虑数字之间穿过的情况。

于是直接模拟了一下,对于某个数标记一下是否这个位置被占用。然后先模拟把所有偶数变成奇数,再反过来模拟,取最小值。模拟思路就是对于第i个数,去寻找第一个满足条件的 a[i] + j 或 a[i] - j ,然后把数字填上去。

一开始我还考虑了,会不会出现我先考虑左边后考虑右边,如果左边满足条件就填进去,而不去考虑右边的话,情况不会最优? 后来觉得排序可破。于是大胆写了,过了Pretest。

结果就被人hack了。

hack的数据是:

1
2
10
5 6 7 8 9

这组数据会出现,7可能放到了10的位置,9又要往左走放到左边的位置这样的情况(9放到10才是最优的)。

想了想觉得或许加一些特判,或者从左往右再从右往左搞一搞可破。但是觉得这么写下去,越写越不像是个正解的样子。

遂作罢。

正确做法

这道题其实被我想复杂了。考虑到n个位置,一共只给了n/2个数,那么也就是说,每个偶数位或者奇数位肯定是可以被放满的,不会出现要做选择,有些放满有些没有的情况。

所以我们只需要对于第i个数字,考虑他和第i个偶数(奇数)位之间的关系,然后加起来取最小值就可以了。

感觉自己真是越来越菜了,哎qwq.



本文标题:Codeforces Edu.44 CF985A Chess Placing

文章作者:Xie Keyi

发布时间:2018年05月22日 - 16:05

原始链接:https://xiekeyi98.com/9fede59d.html

许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 转载请保留原文链接及作者。