UVA 11462 Age Sort

题意

排序,25MB大数据,都是整数,最大100最小0,内存极其紧张。

思路

面对这种数据范围很小,量很大的情况,考虑计数排序,原理非常简单就是开个数组统计一下不同值有多少个数字就搞定了,时间O(n)。

能做到O(n)的排序算法还有Sleep Sort,不过因为利用多线程睡眠差异太难控制所以也没啥实际意义。

被卡常数的时候,也可以考虑用计数排序进行没什么卵用的优化(结果可能就真卡过了)。

代码

LA3177 Beijing Guards

题意

可以参见LRJ白书第一章例题16.

有n个人,围个圈,每个人想要一定数量的礼物,注意每个人所持礼物不可以重样,两个相邻的人所持的礼物也不能重样,问你至少要准备多少种不同的礼物,才能符合要求?

思路

大概是个构造题综合二分答案。

首先要想到对n的分类讨论:

  • 如果n是偶数,那么你只需要准备两套不同配置的礼物,按照ABABABABAB这样循环下去就可以满足要求了,因此答案是max{r_i+r_((i+1)%n)}
  • 如果n是奇数,情况就比较复杂。我们可以先反向思考,如果给定有r种礼物,如何才能构造合适的礼物配置满足题设要求?白书里面给了这样一种方法:令编号为奇数的尽量选取靠前的种类,编号为偶数的尽量选取靠后的种类,即把r种礼物分成两半(即前、后两组),对于每一个人维护他按照上面策略进行选取的前组后组中元素数量,最后检查第一个人和最后一个人是否相容即可。这样我们就有了二分答案的检查方法了。

代码

 

LA3902 Network

题意

给出了一棵树,和一个初始的黑点(VOD服务器),所有边的边权均为1,你要求出最少还要染黑几个点,才能保证每一个白点到最近黑点之间的距离小于等于k。

思路

大概是贪心。

把给出的初始黑点当成树的根部,从根部dfs一次求出所有节点的深度,然后把深度最大的点(如果深度大于k)染黑,之后以这个点为中心dfs一次标记所有能覆盖的点。然后找第一个没有被覆盖的点,染黑,标记。。。直到所有点都被标记。

代码

 

UVa 11520 Fill the Square

题意

填充一个NxN网格,使得每个格子的字母与其相邻的字母均不相同。输出字典序最小的填充方案。

思路

注意到解的空间非常大,因此只要每一次从’a’~’z’枚举并检查当前格子就可以了。这样也可以保证字典序最小,因为每一次的填充是从最小的字母开始尝试的。

代码

 

LA3635 Pie

题意

给出若干个Pie,你要求出最大的大小k,使得每个人(包括自己)得到的Pie的大小都正好为k,注意在分Pie的时候,可以切碎,但是不可以给一个人不同种的Pie。

思路

二分答案。

类似于“最小值最大问题”,检查的时间可以接受,因此问题可以通过二分答案解决。

代码

 

LA3971 Assemble

题意

请参考LRJ白书第一章例题11

思路

二分答案。

典型的“最小值最大问题”,考虑二分答案,检查一次二分的时间是可以接受的,因此本题得到解决。

代码

 

UVa 10795 A Different Task

题意

可以参考LRJ大礼包白书第一章例题11

和汉诺塔游戏一样的规则,区别是这个问题会给出多达60个圆盘每一个最开始在哪根柱子上,要你求出从这个局势开始到终盘(00n)最少要移动多少次。

思路

大概是个。。。构造题?

思路比较复杂,而且还涉及传统汉诺塔问题的结论(把一根有k个盘子的堆移到一个空柱子上,需要((2^k)-1)步)。

具体的思路可以参考白书P27.

代码

POJ 2114 Boatherds

题意

给出一棵树,树边带有边权,问你能不能找出一条路径使得路径边权之和正好等于给出的k值。

思路

和这个题非常像,只不过题意从计算有多少点对之间距离小于k换成了判断有没有一条路径等于k。但实际上可以用一套思路解决。

代码

 

POJ 1987 Distance Statistics

题意

给出一棵树,和树上两点之间的边权大小,要你快速回答出树上有多少不同的点对使的这对点之间的距离至多为k。

思路

典型的点分治问题。

当考虑一棵有根树中有多少点对的距离小于等于k时,可以求出所有节点到根部的距离,然后使用二分,或者尺取的方法得到有多少对点之间的距离小于等于k。但是在上面的计算过程中我们想要求的是经过根部的符合要求的点对数量,但实际上多算入了一些并不符合要求的点,同时也漏掉了不经过根部的符合条件的点对。

所以我们可以这样看:一棵树的符合条件点对数=上面所述方法找出的点对数-各个子树中两点间距小于等于(k-2e)的点对数目(e是根部到孩子的树边的边权)+各个子树符合条件的点对数

上面的式子是递归的,这是一个树分治(点分治)策略。

在实现树分治的时候,一定要注意只有配合了重心的点分治才能达到O(nlogn)的复杂度,否则会面临特殊情况(比如链)退化到O(n^2).

代码

 

 

POJ 3107 Godfather

题意

变相考察树的重心。

思路

请参考这个题和/或这个题

代码

 

Scroll to top