【题解】牛客NOIP暑期七天营-普及组6

A.Bunny的平均数

对于50%的数据

自由发挥

对于100%的数据

根据平均数的定义,平均数。现在已经给出了个数和平均数,把式子左右两边同乘,得,即。所以对给出的个数求和,将减去这个和即为答案。
std:
https://paste.ubuntu.com/p/zdyWFKTjtG/

B.Bunny的任务

对于50%的数据

直接深搜即可。搜索所有做任务的可能,在所有合法的任务顺序下取最大的答案。

对于100%的数据

贪心地想,要在有限的时间内做尽可能多的任务,就必须从耗时小的任务做起。所以对从小到大排序,统计前缀和小于等于的地方最大在哪里,输出答案。
std:
https://paste.ubuntu.com/p/NHZmN4xgmV/

C.Bunny的修路工程

对于30%的数据

很小,直接暴力搜索边是否选择。

对于50%的数据

的做法通过,自由发挥。

对于100%的数据

我们可以贪心的思考,每一个城市都往最近的一个大商场前进。
那么就将所有有大商场的城市都加入队列,并向外一层层拓展,如果拓展到的点是遍历过的则不加入队列并删除拓展所走的边,否则加入队列。
我们来证明这样的贪心是正确的。
由于题目中说“原来的兔子王国已经满足了兔子们的要求”,那么可以保证每一个点都是可以往最近的大商场走的,不会不满足最多走 条路的限制。
为有(一个或多个)大商场的城市数。
想象一下,将有大商场的城市与离他最近的其他城市看成一个点,那么缩点完后有 个点。因为原先是树,缩点后也依旧会是树。
那么多余的边数就是 ,用来连接这 个点的边。
以上证明了答案的可行性,接下来我们证明 是最大能删的边数。
我们假设能删除 条边,那么就说明缩点后的树有 个点(缩点意义上),而我们只有 个城市有大商场,那么至少有一个点是没有大商场的,因此不可能删除这么多边。
至此,我们证明了 是最大的答案。
那么就不需要实现bfs了,直接去重得到 就好了。
std:
https://paste.ubuntu.com/p/BpRjWBxcFd/

D.Bunny的聚会

D Bunny的聚会

10%的数据

显然可以直接爆搜,爆搜每一步让哪一只兔子往哪里走。

复杂度

20%的数据

这里保证兔子的位置单调递增,显然最终的答案是把一段连续区间里的兔子全部聚在一起,那么我们可以枚举这段区间的左右端点,枚举把兔子聚集到的位置,判断是否能让这段区间内的所有兔子都到达那里。

用最暴力的方法实现,复杂度

35%的数据

我们可以证明对于一群兔子,设他们的位置为,使它们聚集到同一个点时总路程长度最小的位置,是它们的中位数。

考虑若当前把兔子聚集到位置,若不是中位数,则有

  • ,则若它们聚集在,总路程减少
  • ,则若它们聚集在,总路程减少

综上,让这些兔子在中位数聚集总路程最少。

因此我们依然可以枚举聚集兔子的区间计算出兔子位置的中位数,然后计算把区间中的兔子聚集在中位数的代价,判断是否满足条件。

时间复杂度

50%的数据

给定区间的左右端点显然可以直接计算区间内兔子位置的中位数,我们可以用一些技巧(例如前缀和)直接计算把区间内的兔子聚集在中位数的代价,因此对于每个区间的判断我们只需要的复杂度。

时间复杂度

70%的数据

考虑固定左端点,发现区间聚集到中位数的代价关于区间右端点单调,那么我们可以对于每一个可能的左端点,二分右端点的最大位置并统计答案。

时间复杂度

100%的数据

我们还可以发现合法的区间右端点的最大位置是关于左端点位置单调递增的,因此我们使用双指针即可在的复杂度内统计答案。
std:
https://paste.ubuntu.com/p/MrzZm6Zy8V/

全部评论
T3的解法太巧妙了,代码段的难以想象
点赞 回复 分享
发布于 2019-09-02 21:03
T4写二分答案也能过
点赞 回复 分享
发布于 2019-08-25 12:40
T2从小到大排吧。。
点赞 回复 分享
发布于 2019-08-25 12:38

相关推荐

点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务