CF1836
A.Destroyer
开个桶记录个数,看满不满足单调不上升即可。
B.Astrophysicists
辛辛苦苦写了这么久的文章就没了????烦死了。
自己做 Virtual Contest 的时候这道题打表打了半天(20min)才搞定……
题目大意
有 \(n\) 个人,\(k\) 个金币,每个金币价值 \(g\) 个银币。
良心公司要把这 \(k\) 个金币作为工资分给这 \(n\) 个人,但是没有办法平均分配,良心老板想出了分配规则:
由你设定每个人分配的银币数 \(x_i\)。
你需要保证 \(\sum_{i = 1}^n x_i = k \times g\)。
老板会把银币数转化为金币发放,所以想出了以下规则:
令 \(r = x \mod g\),如果 \(r \ge \lceil \frac g2 \rceil\),那么公司会额外花费 \(g - r\) 个银币以凑出完整的金币(此时花费了 \(x + g - r\) 个银币)。
反之,会吞掉这 \(r\) 个银币以凑出完整的金币(此时花费了 \(x - r\) 个银币)。
假定最终公司的花费为 \(p\) 个银币。你需要最小化 \(p\),并输出 \(k \times g - p\)。
解题思路
如果开始没有思路,那么打表是一个很好的方法。
首先我们可以很轻易的得到一个 \(O(nkg)\) 的 DP 算法。
设 \(f_{x, i}\) 表示处理到第 \(x\) 个人,一共分配了 \(i\) 个银币公司省下的最多银币。
有转移方程:
\]
其中:
\]
r - g &, r \ge \lceil \frac g2 \rceil \\
r &, r \lt \lceil \frac g2 \rceil
\end{cases}
\]
运行后输出 DP 数组,结合 \(m = \lceil \frac g2 \rceil - 1\)可以很轻易的发现规律:
最终的数组分为两个部分:
第一个部分为 \([0, nm]\),下标与数值一一对应。
第二部分为 \([-\lfloor \frac g2 \rfloor - m - nm, nm]\) 不断循环。
现在我们来严谨证明一下。
理想状态下,我们自然是给每一个人分发 \(m = \lceil \frac g2 \rceil - 1\) 个银币,这样就可以吞掉 \(nm\) 个银币。
但是可能存在一下两种情况:
其实根本没有 \(nm\) 个银币,所以全部都分配到 \(\le m\) 个。所以全部可以吞掉。对应上文中第一部分。
还剩下了 \(r = k \times g - nm\) 个银币。由于我们可以按照一个金币为单位再分配,所以我们只需要关注 \(r \mod g\) 的值。
显然,如果把这些银币分给不同的人是不优的,因为破坏了老板吞掉更多人 \(m\) 个银币的美梦。
所以这些银币应该全部分配给一个人,对于答案做出贡献 \(w(m + k \times g- nm) - 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(10^{\min(A, B)})\) 可以过。
那么考虑顺序枚举 \(A\) 位的数 \(a\),满足的数 \(b\) 应该为一个连续区间,这个可以 \(O(1)\) 解决。
所以区间长度与 \(k\) 判断一下即可。
提交记录:https://codeforces.com/contest/1836/submission/211137329
随机推荐
- 力扣23(java)-合并k个升序链表(困难)
题目: 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1 ...
- Nacos2.0的K8s服务发现生态应用及规划
简介:Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能.随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社 ...
- 阿里云边缘云ENS再升级 四大场景应用加速产业数字化落地
简介: 云栖大会 | 于10月21日上午举办的边缘云应用升级与技术创新论坛中,阿里云边缘云ENS产品全面升级,从边缘云产品.技术.行业应用等维度全面阐述阿里云在边缘计算领域的技术积累.产品& ...
- [FAQ] Git 修改最后一次的提交人和提交时间 ?
$ date -R Tue, 21 Mar 2021 21:08:58 +0800 $ git commit --amend --author="xxx <xxx@email.com ...
- WPF 更改 DrawingVisual 的 RenderOpen 用到的对象的内容将持续影响渲染效果
在 WPF 里面,可以通过 DrawingVisual 来进行使用底层的绘制方法,此方法需要调用 DrawingVisual 的 RenderOpen 拿到 DrawingContext 类型的对象, ...
- Echarts立体地图加3D柱图可点击可高亮选中的开发
注意 echarts请使用v5.1.0以上版本,低版本会无法显示,或者无法触发点击事件. 若有闪屏bug,不要设置temporalSuperSampling属性. 注意图层顺序. 实现原理 借助 ec ...
- 第一章 Jenkins安装配置
Jenkins官网 # 官网: https://www.jenkins.iohttps://www.jenkins.io/zh/ # docker安装: https://www.jenkins.io/ ...
- 如何将本地项目第一次同步到gitee远程
一,Gitee账号的注册/登录 在gitee登录入口输入相关信息进行注册登录https://gitee.com/signup#lang=zh-CN 二,本地安装git客户端并配置用户信息 1.Git ...
- vue点击旋转,再点击复原
效果: 1.html.通过绑定t值控制不同的class名, 原图是右边方向的箭头 <img class="right" v-if="item.t" src ...
- Oracle和达梦:相似度函数:UTL_MATCH
UTL_MATCH介绍: Oracle的UTL_MATCH包是一个提供字符串匹配和相似度计算功能的工具包.它包含了一系列函数,用于执行字符串比较.相似度计算和模式匹配等操作. UTL_MATCH包中的 ...