LA 3708 Graveyard

题意

请参考LRJ白书第一章例题4.

思路

大概是构造题。

跟白书不太一样的解法,贪心地把两种方案的一个顶点对在一起,然后逐个检查,取两种方案的最小角度差,加在一起,就是答案。

代码

 

UVa 11300 Spreading the Wealth

题意

请参考LRJ白第一章例题3

思路

大概是个构造题。

解决的方法是把整个题转化成一个方程组,令每个人手里的初始金币数量为Ai(已知),送出数量Xi,受付数量Yi,最终每个人金币数量M(已知),这样得到由若干形如Ai-Xi+Yi=M方程组成的方程组,当所有方程形式一样时,考虑逐个联立消去未知量,最终得到了关于X1和Xi的若干等式(注意到Xi和Yi+1的相等关系),我们的目标是令Xi之和最小,我们把所有Xi加在一起,就得到了一个仅关于X1的和式。

这个和式的形式可以几何表示是求数轴上一个点,使得其与若干已知点距离之和最短,这个问题的解取在中位数,这样本问题就可以解决了。(中位数是解的想法在白书上有详细的证明,使用反证法)

综合来看,本体需要适当转化,数学变形,数形结合。

代码

 

UVa 11729 Commando War

题意

请参考《LRJ大礼包::白》第一章例题2

思路

大概是贪心。

只要交代了任务,部下自己就会给做完了,基于这样的题意我们就可以设计这样的一种贪心策略:优先考虑完成任务时间长的,这样交代完了之后就会有更多的时间可以一边交代任务一边有人完成任务,更有效率。

具体操作就是把完成任务时间从大到小排个序,然后顺着检查一遍。

这个策略的证明在白书上面有提供,大概的证明套路就是说明不用这个策略时得到的答案不会更优,在证明时分类讨论了两种情况。

代码

 

 

 

POJ 3646 The Dragon of Loowater

题意

请参考<LRJ大礼包::白>的第一章例题1.

思路

大概是贪心。因为骑士的能力=能砍多大=花多少钱,这样的话只要排个序,从最便宜的英雄开始检查,从小头开始砍,直到检查完最后一个英雄。

如果没砍死就是没解,否则一定是最优解,这个思维和Kruskal算法是一致的。

代码

 

Editoral for SCUT ICPC Team Qualification Round A

点按此处下载题面

PROBLEM A

很明显,双方最优策略是一直往前走,对手一直往前就能赢了,所以bx hao sui啊!

PROBLEM B

做这个题需要知道二项式定理,乘法逆元和等比数列求和,组合数取模。

    \[\sum_{i=1}^{n}(a^{i}+b^{i})^{k} = \sum_{i=1}^{n}\sum_{j=0}^{k} \binom{k}{j} a^{ij}b^{i(k-j)}=\sum_{j=0}^{k}\binom{k}{j} \sum_{i=1}^{n}q^{i}\]

    \[q = a ^ {j} b ^ {k-j}\]

后面就是等比数列的求和。

需要注意的是q=1的时候。

二项式系数可以用阶乘和逆元预处理,等比数列求和也可以用逆元求出来。复杂度O(Klog(N))。

PROBLEM C

这题求的是一个有向无环图的最小树形图。可以对每个点,选一个权值最小的入边加起来就是答案。

PROBLEM D

直接模拟统计出到最后时刻情怀值会受损多少。对于每个时间点,如果不能ak,则损害值增加tn-ti。最后总的损害值如果比原始情怀值小则just enjoy coding,否则fail to graduate。

PROBLEM E

PROBLEM F

PROBLEM G

 

PROBLEM H

对于每个数,我们需要满足的条件有两个:一个是各数位数字单调递减,第二个是这个数字满足被6整除。首先,如果直接枚举满足第二个条件的数,那么要枚举的数太多,复杂度太高。那么我们首先考虑满足第一个条件。各个数位的数字单调递减说明了各个数字不同(即每个数只能选一次),而数字只能在0-9这10个数选取(说明最多取10个数),且满足单调递减(说明对每组取的数,只有一个方案是符合的)。于是所有满足条件“各数位数字单调递减”的数字只有C(10, 1) + C(10, 2) + C(10, 3) + … + C(10, 9) + C(10, 10) = 2^10-1 = 1023。于是我们可以通过搜索的方法找到所有满足第一个条件的数,然后判断是否满足第二个条件。搜索的方法是先枚举高位,再枚举低位,每次枚举的数都得比高位的数小,直到没有数可以枚举(最小是0)结束。用递归可以解决。最后我们求出所有满足第一和第二个条件的数只有两百多个。注意最大的数会超出int的范围,所以我们可以用一个long long数组存下满足条件的数。接下来我们由于我们最多只有20组数据,所以我们可以判断每个合法的数是否小于或等于输入数据。

主要部分代码如下:

 

PROBLEM I

 

PROBLEM J

把下标乘上1000得到一个递推式子,

BX(n) = BX(n – 1000) + BX(n – 1234)。

答案就是BX(n*1000)

Author Information

ABCJ : doubility(czk)

DH : ConquererV587(kbx)

GI: Xdynix(rxy)

Scroll to top