洛谷P2519《[HAOI2011]problem a》
七月 30, 2019
3461
人类智慧题
由于一些原因,不对题面作出展示,请自行寻找
解析
我个人对「人类智慧题」对定义是「运用人脑求特殊解也想不出来的问题」
第一眼看到这题的时候,我一脸问号
直到老师开始讲题……
首先把题目转化一下
对于每个学生,给定了有多少成绩比他好、比他差,那就把数据转换为一个成绩区间,表示这个区间内的人(可能只有 1 个)成绩相同
然后考虑一下「假话」的判断方式
- 成绩比他好的 + 成绩比他差的 + 他 > 总人数
这个请自行理解 - 两个有交集的区间没有完全相同,那么两个区间必有一个是假话
这个很显然吧,就是两个区间有交集的话说明它们是一个成绩,然而小于这个成绩的人或大于这个成绩的人却不相同 - 对于一堆完全相同的区间,它们之间是真话的个数至多是[区间长度]个,超出的部分全都是假话
想一想区间长度的现实意义是什么:有[区间长度]个学生成绩相同。那么,一个成绩是有[区间长度]个人的,也就是说,至多有[区间长度]个属于这个区间对应的成绩的学生在说真话(可以看作他们的成绩属于这个区间对应的成绩),剩下的学生都在说假话。
这样说应该会好理解一些吧……实在不行我举个例子:[2,4],意味着这个区间对应的成绩有 3 个人获得了,那么如果有 4 个人说“我获得了这个成绩”,那么肯定有 1 个人在说假话。
经过筛选,区间数量减少了一些,再去个重,把相同的区间个数用权值的形式表示出来(对每种区间分配唯一 id),比如说我有三个[2,4]和一个[7,8],我就可以对[2,4]这个区间加一个权值 3,对[7,8]这个区间加一个权值 1。
那么问题现在变成了:带权值的线段覆盖,求最大权值和
这个就是一个 dp 问题了
下面这一段也是从我代码里复制过来的(
1 |
|
代码实现
代码里有很多注释,应该会很好理解
1 |
|
- 本文作者:Handwer STD
- 本文链接:https://blog.handwer-std.top/2019-07-30/Luogu-P2519-BZOJ2298/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!