CF1703G

链接:

Problem - 1703G - Codeforces

题目大意:

你有 \(n\) 个箱子。第 \(i\) 个箱子中有 \(a_i\) 个硬币。你需要按照从箱子 \(1\) 号到箱子 \(n\) 号的顺序打开所有 \(n\) 个箱子。

你可以用以下两种钥匙之一打开一个箱子:

  • 好钥匙:使用一次消耗 \(k\) 个硬币。
  • 坏钥匙:使用时不消耗硬币,但会使所有未打开的箱子中的硬币数减半(包括正要打开的这个箱子)。硬币减半时向下取整。比如,用坏钥匙打开箱子 \(i\) 号时,\(a_i=a_i/2\),\(a_{i+1}=a_{i+1}/2\),\(......\),\(a_n=a_n/2\)。

所有钥匙用过一次就会断掉(别想着买一把好钥匙开完所有箱子了),好钥匙需要重复付费,坏钥匙效果会重复计算。

也就是说,你总共需要使用 \(n\) 把钥匙,每个箱子用一把。开始时,你没有硬币和钥匙,如果想用好钥匙,你就得去买。值得注意的是,在这个过程中你可以赊账买钥匙;例如,如果你只有 \(1\) 个硬币,你也可以购买价值 \(k=3\) 个硬币的好钥匙,你的余额会变成 \(-2\) 个硬币。

你需要求出开完所有箱子之后你能获得的最大硬币数量(显然大于等于 \(0\) )。

思路:

做到这种题,我们一般有两个思路:

贪心orDP

我们首先应该考虑DP,因为DP基于暴力,更容易想;

这道题,我们会有一个除2操作,这个次数任意,这肯定是辅助我们的一个工具去用这个除2获取更大利益

题目要求最大硬币数量,我们就设 f(i) = 在i的位置的最大值硬币数

补充维度,一个维度i肯定不行,我们的工具使用多少次,这也需要一个维度,容量应该是log(1e9)大约开30即可

所以dp方程:

\(
dp[i][j] = \begin{cases}
dp[i - 1][j-1] + a[i]/2^j ,&j >0 \\
dp[i - 1][0] + a[i] , &j = 0
\end{cases}
\)

代码:

const int N = 200005;
int n,k;
int a[N];
void solve(){
cin >> n >> k;
for(int i = 1;i<=n;i++) cin >> a[i];
int dp[n + 1][31];
int ma = 0;
memset(dp,0,sizeof dp);
for(int i = 1;i<=n;i++){
int p = a[i];
dp[i][0] = dp[i - 1][0] + a[i] - k;
ma=max(dp[i][0],ma);
for(int j = 1;j<=30;j++){
p/=2;
dp[i][j] = dp[i - 1][j - 1] + p;
ma=max(dp[i][j],ma);
}
}
cout << ma <<endl;
}

时间复杂度

O(30*n)

随机推荐

  1. Typora行内公式识别不了

    Typora行内公式识别不了,主要是因为行内公式属于LaTeX扩展语法,并非Markdown的通用标准 需要在Typora的"文件"-"偏好设置"-" ...

  2. 高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  3. Linux系统获取开发板的文件系统并打包成img文件

    应用情形: 在实际的开发中,由于原系统包含的功能有限,而根据项目的需要,安装了相应的库及运行项目程序所创建的各种文件,和所做 的各种配置,想将调试好的系统打包发布,进行批量生产,就可参考本文提供的方法 ...

  4. Windows批处理文件(.bat和.cmd)

    cmd文件和bat文件的区别 从文件描述中的区别是,cmd文件叫做:Windows命令脚本,bat文件叫:批处理文件,两者都可以使用任意一款文本编辑器进行创建.编辑和修改,只是在cmd中支持的命令要多 ...

  5. Linux Shell 常用命令 - 01篇

    系列文章: Linux Shell 常用命令 - 02篇 0. 在线使用 Linux Shell 参考 https://www.sohu.com/a/343421845_298038 JS/UIX - ...

  6. Oracle 字符串分割,并将内码转中文(简单实现),项目实战

    导读 实际项目开发过程中,可能会遇到这种情况,A表中A1字段存储B表中的内码如(1,2,3),此时需要将A表中的A1字段转中文,为了方便理解,我们这里创建学生表和老师表,一个学生对应N个老师. 创建表 ...

  7. 原创软件 | 系统服务工具箱原创软件(587KB)--基于aardio开发的第一个程序

    1 系统服务工具箱简介 该软件是我使用aardio开发的第一个程序,它集成了多个系统常用的快捷键,无需记住各种命令就能快捷使用cmd管理员.计算机管理.控制面板.组策略.注册表.服务.任务管理.卸载程 ...

  8. 8行JS代码实现Vue穿梭框

    实现效果 完整 demo 参考 <template> <div class="contain"> <ul class=""> ...

  9. [oeasy]python0123_中文字符_文字编码_gb2312_激光照排技术_王选

    中文编码GB2312 回忆上次内容 上次回顾了 日韩各有 编码格式 日本 有假名 五十音 一字节 可以勉强放下   有日本汉字 字符数量超过20000+     韩国 有谚文 数量超过500 一个字节 ...

  10. 【SQL】Lag/Rank/Over窗口函数揭秘,数据分析之旅

    七月的夏日,阳光如火,但小悦的心中却是一片清凉与激情.在数据分析项目组的新岗位上,她仿佛找到了自己新的舞台,这里让她得以将深厚的后端技术实力与数据分析的精髓深度融合.每天,她都沉浸在业务需求的分析与数 ...