Google Kickstart 2020 刷题笔记

本文是关于Google Kickstart 2020 Round A的比赛题目回顾,重点分析了Workout和Bunding两道题目的解题思路。对于Workout问题,介绍了使用二分猜想法和最大堆两种解决方案。Bunding问题的解决依赖于数学归纳法,证明了最佳分组策略,并讨论了如何计算贡献值的方法。
摘要由CSDN通过智能技术生成

Round A 2020

3. Workout

  • 用二分猜想法,每次猜想一个最小困难值,然后计算要达到这个值需要插入多少session,如果插入的session数不大于K则困难值合法
  • 猜想次数最多为 l o g ( 1 0 9 ) ≈ 30 log(10^{9})\approx30 log(109)30,每次验证需要扫描一遍即 1 0 5 10^5 105,所以复杂度还好
  • 在网上看到另一种方法,就是用最大堆,每次弹出最需要划分的那个,划分数+1,然后塞回去,直到用完所有划分额度,这样的复杂度还低一点

4. Bunding

  • 这题确实需要依赖一些特别的数学性质;我们先证明一个引理:最好的分组方法,就是每次取出当前相同前缀最长的一组;例如若将下面分为两组,则一定是先取234行,再取156行
ABCD
ACDE
ACDF
ACDG
ADEG
BEFG
  • 用归纳法证明,如果当前应该取出的那组贡献为 G 0 G_0 G0,但它被拆开取出,拆开后每组贡献为 G 1 G_1 G1, G 2 G_2 G2, …, G k G_k Gk,不妨设 G 1 ≤ G 2 ≤ . . . ≤ G k ≤ G 0 G_1\leq G_2 \leq ... \leq G_k \leq G_0 G1G2...GkG0,则未拆开前的总和 ≥ G 1 + G 2 + . . . + G k − 1 + G 0 ≥ G 1 + G 2 + . . . + G k \geq G_1+G_2+...+G_{k-1}+G_0 \geq G_1+G_2+...+G_k G1+G2+...+Gk1+G0G1+G2+...+Gk,故不拆开一定不比拆开差
  • 至于如何用这个引理计算我们的 S U M SUM SUM,还需要一个推论:若一个前缀出现的数量为 C N T CNT CNT,则它对 S U M SUM SUM 的贡献为 ⌊ C N T / K ⌋ \lfloor CNT/K\rfloor CNT/K;证明为,由于每个前缀都会被尽可能连续地取出,所以它一定会填满 ⌊ C N T / K ⌋ \lfloor CNT/K\rfloor CNT/K 组;剩下的填不满,贡献为0
  • 官方建议用Trie数来计算出现的前缀数量,我觉得也许先排序然后相邻的两两比较也行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值