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

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

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

    根据上面的公式,我们自然可以得到f[m][n]=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 财务统计

    水题,但是我写的题意有些费解……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值