第一章 算法设计基础
一、例题
1、Dragon of Loowater (UVa 11292)
贪心
先把龙头的直径和武士的能力排序,然后从小到大考虑每个武士
如果这个武士能够把当前正在考虑的龙头干掉就干,否则考虑下一个武士
贪心的正确性十分显然
2、Commando War (UVa 11729)
贪心
直觉告诉我们,先交待执行时间长的任务
所以按照执行时间的大小从大到小排序,依次交待任务即可
为什么是对的呢
假如交换两个任务的顺序,例如将任务a与任务b交换,设a是第i个任务,b是第j个
a的结束时间原来为
t∗i+j[a]
t
∗
i
+
j
[
a
]
,现在为
t∗j+j[a]
t
∗
j
+
j
[
a
]
b的结束时间原来为
t∗j+j[b]
t
∗
j
+
j
[
b
]
,现在为
t∗i+j[b]
t
∗
i
+
j
[
b
]
已知
j[a]>j[b],i<j
j
[
a
]
>
j
[
b
]
,
i
<
j
显然
max(t∗i+j[a],t∗j+j[b])<max(t∗j+j[a],t∗i+j[b])
m
a
x
(
t
∗
i
+
j
[
a
]
,
t
∗
j
+
j
[
b
]
)
<
m
a
x
(
t
∗
j
+
j
[
a
]
,
t
∗
i
+
j
[
b
]
)
(和相同,差变大),因此只会变差
所以原来的顺序是正确的
3、Spreading the Wealth (UVa 11300)
先把最后所有人的钱算出来
然后设n个变量,
xi
x
i
表示第i个人给第i+1个人多少钱,如果为负则表示第i+1个人给第i个人
|xi|
|
x
i
|
的钱
对每个人列出一个等式,我们就会发现,实质上是要求一个x,使得
|x−a1|+|x−a2|+|x−a3|+...+|x−an|
|
x
−
a
1
|
+
|
x
−
a
2
|
+
|
x
−
a
3
|
+
.
.
.
+
|
x
−
a
n
|
最大
显然x应该取a数组的中位数
然后这题就解决了
4、Graveyard (LA 3708)
观察样例会发现,有一个墓的位置不变
这其实不难证明。考虑最优的安排方案,假如所有墓的位置都变了,不妨将所有墓顺时针转一个小角度,假如更优,则矛盾,否则将其反方向转,一定更优,除非有一个点在原来的位置,这样怎么转这个点的权值都会增加,所以不会更优
这一点确定以后,就把每个墓最终的位置都确定了,只要把每个墓和离它最近的位置的距离加起来即可
5、Piotr’s Ants (UVa 10881)
经典题 (弹性碰撞)
就是我sb地看错了题,以为撞到两边之后并不会掉下去而是折返,想了好久,后来发现自己是如此地**
6、Image is Everything(LA 2995)
有趣的题
原来不大会做,看了书上的做法
就是从外围一点点减去方块,直到都满足条件为止
首先如果六视图中某个视图的某个位置为
.
.
那么这个位置所对应的一条都没有方块
然后就是一个一个视图地看,对于每个有颜色的视图格子,枚举深度d,这样对应的方块就唯一了,去看对应的方块有没有被上过色,如果没有,将其上色,否则看颜色是否相同,若不相同,则该方块不存在,然后去看更深一层的方块
7、Even Parity(UVa 11464)
这题不难
枚举第一行的状态,然后直接算出整个矩阵,看是否可以得到
8、Colored Cubes(LA 3401)
这题真心无聊
明明很水的一道题,强行搞成非常繁琐
首先算出来每个正方体旋转一共24种形态,然后就解决了
固定第一个正方体形态不变,枚举其它正方体的旋转方式,然后看每个面出现最多的颜色是啥,n-出现最多的次数 的和即为当前状态的答案
预处理出所有旋转的方式(打表)