重邮第八届ACM大赛-决赛题解报告

这篇博客是关于重邮第八届ACM大赛的决赛题解,涵盖了贪心算法在果姐姐的项链问题中的应用,二分查找在切披萨问题中的解决方案,稳定排序的签到题解析,以及动态规划、RMQ、搜索、数学和哈夫曼编码在其他题目中的应用。通过这些实例,展示了各种算法在实际问题中的巧妙运用。
摘要由CSDN通过智能技术生成
  • 列表内容

A. 果姐姐的项链

贪心、构造

长度为N的01序列一共有 2N 种,所以L的理论最大值为 2N
当N比较小时,尝试暴力构造,找规律发现:

  • 答案具有000…0……111…1的形式(N个0+中间部分+N个1)

尝试贪心构造:

  1. 初始化序列为11…100…0(N个1+N个0),并标记其中已经出现过的序列
  2. 尝试在末尾加0,若新组成的序列(当前序列的后N-1个字符+0)未出现,则确定加0,并标记该序列出现过。若出现过,则再尝试在末尾加1。
  3. 当序列无论加0加1都无法构成未出现过的序列时(长度达到理论上限时),停止

例如,N=3时
初始化序列为111000,vis表:000、100、110、111

  1. 尝试加0,新组成000,在vis表中
  2. 尝试加1,新组成001,不在vis表中
  3. 当前序列1110001,vis表:000、100、110、111、001
  4. 尝试加0,新组成010,不在vis表中
  5. 当前序列11100010,vis表:000、100、110、000、001、010
  6. 尝试加0,新组成100,在vis表中
  7. 尝试加1,新组成101,不在vis表中
  8. 当前序列111000101,vis表:000、100、110、000、001、010、101

此时可以发现,序列长度已经超过 23=8 ,并且此时无论加0加1肯定也都无法组成新序列了。
当前序列长度为9?那是因为没有考虑到这是循环串。
事实上若去掉最后加的1,此时的序列为11100010,刚好满足条件,其最小表示为00010111
这个序列长度首先达到了理论最大值,并且由于贪心构造,字典序也得以保证。

用同样的构造方式,容易验证,对于 n20 ,都可以得到长度 L=2n 的序列
长度为n的01串可以当成 02n1 的2进制数,可以用数组简单的实现vis表。
code

B. 切披萨

二分

设切的位置为 xf(x) 表示左边pizza的美味度,易知 f(x) 为单调函数
现在想求 x1[0,n] ,使得 f(x1)=f(n)2

  • 使用二分法求 x1 即可
  • 其中 f(x) ,可以在 O(n) 内算出。只需要枚举每个圆与竖线的位置关系,在左边则全部加上,相交则求左部的面积。

code

C. 稳定排序

签到题

不难想到,稳定排序的结果是唯一
自己做一次稳定排序,导出p数组,然后再与给的p数组比较即可
code

D. 方程式配平

高斯消元+分数类

设每个反应物、生成物前的系数为 xi ,根据质量守恒定律,对每一个元素建立一个线性方程,则得到了一个关于x的线性齐次方程组 Ax=0 。使用高斯消元解即可。
例如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值