您的位置:首页 > 其它

中南大学ACM12月月赛第二场热身赛解题报告

2011-11-20 18:54 197 查看
Problem A 考察地形

题目中所描述的P即指任意两点之间的所有最短路径所覆盖的不同的路的条数,最后要求求P的最大值。

一个比较直接、暴力的想法就是首先用Floyd处理出任意两点i,j间的最短路,然后枚举i、j,每次扫描一遍顶点确定在所有最短路中都有哪些顶点,即对k满足f[i][k]+f[k][j]=f[i][j]。然后凡是最短路上的边,必然是k的集合中的点所连成的边,因此我们再一对一对枚举k集合中的点x、y,并判断两点间的那条路是否在最短路上,即是否满足f[i][x]+g[x][y]+f[y][j]

==f[i][j]或者f[i][y]+g[y][x]+f[x][j]==f[i][j],并计数即可。

需要注意的是,由于两点之间可能有多条路径,而显然比较长的是没有用,因此在读入数据时就可以顺便处理并保留两点间最短的那条路,并顺便统计出数量,便于后面统计结果。

Problem B 基础设施建设

这个题目可以转化成最小割去求解。

由于利润同时可以看做是所有可能的收益减去建设费用,同时减去因为没有建相应设施而损失的顾客带来的收益,所以可以建一个图,左边为待建设的设施,右边为各消费人群,中间由左向右对应连起容量无穷大的有向边,然后构造一个源点和各设施相连,容量为建设费用,然后再构造一个汇点,让消费人群分别和汇点相连,容量为该消费人群所带来的收益。

最后求建好图的最小割即可。

Problem C 购置游泳圈

这个题目可以转化成用最少点覆盖尽可能多的区间。

因此可以首先将区间按右端点排升序,右端点相同的按左端点排降序,之后每次点都放在当前第一个区间的右端点上,直到遇到一个区间的左端点在该点的右边为止,再重新放点并更新计数。

Problem D 青蛙王子过河

这个题目可以通过递推来得到我们想要的结论,结果是(m+1)*2^n

首先,最多有多少只青蛙能过和取决于最多有多少只青蛙能站在河中央,荷叶显然只能占一个,我们不妨固定荷叶的数目来观察石柱的变化对结果的影响。

我们用f[m]
表示有m个荷叶和n个石柱时,最多有多少只青蛙能够过河。实际上石柱和岸是差不多的,比如如果我们分析有多少只青蛙可以落脚在第n个石柱上,那么显然这是等于f[m][n-1]的,因为只能借助其它n-1根石柱和m个荷叶来达成目的。

于是我们就得到了这样的结论,f[m]
=f[m][n-1](第n个石柱上的青蛙)+f[m][n-1](剩下的地方所有的可以过到对岸的青蛙)。当然,第n个石柱上的青蛙既然能到达第n个石柱,自然也可以到达右岸,因为对青蛙的操作都是可逆的(逆回去时把原本的A变成D即可)。

根据上面的公式,我们自然可以得到f[m]
=f[m][0]*2^n,f[m][0]表示没有石柱时一共可以过到对岸的青蛙,自然就是m+1,这样就得到了最后的结果。

Problem E 放石子游戏

为了保证行和列的唯一性,我们容易想到用二分图去处理,左边为行,右边为列,如果该点有坑即连一条对应的边,这样我们就把问题转化成了求二分图是否有唯一的最大匹配。

在求的时候我们运用一些贪心的思想,如果有一个顶点的度为1的话,那么和这个顶点相连的这条边就必须取,删去这对点以及和这对点相连的边之后继续这样贪心下去。

如果最后有某些点没有删但度却为0,那么就无解,其次,如果有些点的度大于0(或者说大于1),那么就有多组解,再次,就能说明有唯一解了。

Problem F 跳房子游戏

这个题目可以用NlogN的最长上升子序列的求法求解,只不过小于第一个点的值都忽略掉就可以了。

Problem G 镇管的难题

我们不妨设3个边分别为a、b、c,实际上就是去确定满足a^2=c^2-b^2的可能的a都有哪些。

实际上对于整数c、b(c>b),我们可以推证c^2-b^2的取值范围是所有除4之外4的倍数,以及所有除1之外的奇数,这点我就不在此证明了,留给大家吧。

之后,就很容易知道,a只要不为1和2,就都是可以的。

Problem H 排队

基础的链表应用。

Problem I VIP优惠卡

基础的组合数学,但是如果直接去运算的话会超出long long int的范围,但我们发现实际解是小于int的表示范围的,这样我们就可以借助杨辉三角形来求解,首先预处理出杨辉三角形即可。

当然,用高精度也可以。

Problem J 财务统计

水题,但是我写的题意有些费解……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: