CF1836

A.Destroyer

开个桶记录个数,看满不满足单调不上升即可。

B.Astrophysicists

辛辛苦苦写了这么久的文章就没了????烦死了。

自己做 Virtual Contest 的时候这道题打表打了半天(20min)才搞定……

题目大意

n 个人,k 个金币,每个金币价值 g 个银币。

良心公司要把这 k 个金币作为工资分给这 n 个人,但是没有办法平均分配,良心老板想出了分配规则:

  • 由你设定每个人分配的银币数 xi

  • 你需要保证 i=1nxi=k×g

  • 老板会把银币数转化为金币发放,所以想出了以下规则:

    • r=xmodg,如果 rg2,那么公司会额外花费 gr 个银币以凑出完整的金币(此时花费了 x+gr 个银币)。

    • 反之,会吞掉这 r 个银币以凑出完整的金币(此时花费了 xr 个银币)。

假定最终公司的花费为 p 个银币。你需要最小化 p,并输出 k×gp

解题思路

如果开始没有思路,那么打表是一个很好的方法。

首先我们可以很轻易的得到一个 O(nkg) 的 DP 算法。

fx,i 表示处理到第 x 个人,一共分配了 i 个银币公司省下的最多银币。

有转移方程:

fx,i=max0jifx1,ij+w(j)

其中:

r=jmodg

w(j)={rg,rg2r,r<g2

运行后输出 DP 数组,结合 m=g21可以很轻易的发现规律:

最终的数组分为两个部分:

  • 第一个部分为 [0,nm],下标与数值一一对应。

  • 第二部分为 [g2mnm,nm] 不断循环。


现在我们来严谨证明一下。

理想状态下,我们自然是给每一个人分发 m=g21 个银币,这样就可以吞掉 nm 个银币。

但是可能存在一下两种情况:

  • 其实根本没有 nm 个银币,所以全部都分配到 m 个。所以全部可以吞掉。对应上文中第一部分。

  • 还剩下了 r=k×gnm 个银币。由于我们可以按照一个金币为单位再分配,所以我们只需要关注 rmodg 的值。

    显然,如果把这些银币分给不同的人是不优的,因为破坏了老板吞掉更多人 m 个银币的美梦。

    所以这些银币应该全部分配给一个人,对于答案做出贡献 w(m+k×gnm)m

    化简一下)对应上文中第二部分。

提交记录:https://codeforces.com/contest/1836/submission/211134556

C.k-th equality

注意,注意:

Each input file has at most 5 test cases which do not satisfy A,B,C≤3.

所以,O(10min(A,B)) 可以过。

那么考虑顺序枚举 A 位的数 a,满足的数 b 应该为一个连续区间,这个可以 O(1) 解决。

所以区间长度与 k 判断一下即可。

提交记录:https://codeforces.com/contest/1836/submission/211137329

posted @   jeefy  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示