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. 为什么Python的多线程是假的呢?

    https://www.zhihu.com/question/23474039/answer/269526476

  2. 14-LNMP搭建

    介绍 LNMP: Linux + Nginx + Mysql/Mariadb + PHP 借助LNMP,我们就能搭建一个动态的网页. 安装Nginx 详细nginx教程:https://blog.cs ...

  3. Zynq 7000的3种IO

    概念 MIO MIO:多功能IO接口(分配在 GPIO 的 Bank0 和Bank1),属于Zynq的PS部分,在芯片外部有54个引脚.这些引脚可以用在GPIO.SPI.UART.TIMER.Ethe ...

  4. 设备树DTS 学习:学习总结(应用篇)

    设备树DTS 学习:学习总结(应用篇) 背景 经过前几章的学习,我们可以说是掌握了设备树的基础用法,现在作为总结回顾. 1.设备树DTS 学习:有关概念 介绍了什么是设备树,设备树的作用,如何编译设备 ...

  5. 写给rust初学者的教程(二):所有权、生存期

    这系列RUST教程一共三篇.这是第二篇,介绍RUST语言的关键概念,主要是所有权和生存期等. 第一篇:写给rust初学者的教程(一):枚举.特征.实现.模式匹配 在写第一篇中的练习代码时,不知道你有没 ...

  6. Java 集合框架迭代器(Iterator)

    什么是迭代器 使用循环遍历集合 普通for循环 for(int i=0;i<10;i++){} 增强for循环 for(String str:list){} 什么是迭代器Iterator Ite ...

  7. MySQL 索引失效

    全列匹配 最佳左前缀法则 不在索引列上做任何操作(计算.函数.自动.手动类型转换),会导致索引失效 存储引擎不能使用索引中范围条件右边的列 尽量使用覆盖索引(只访问索引的查询(索引和查询列一致)),少 ...

  8. CF620E

    题目 CF620E 思路 这个题是一个在树上操作的题,每次操作的对象都是以一个结点为根的子树,在1e5的操作下暴力做法必然会超时 观察到c的范围很小,可以考虑状态压缩 考虑将此问题转化为区间问题,利用 ...

  9. CGI、FastCGI和PHP-FPM区别和关系详解

    在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM.FastCGI和CGI 这几个概念.如果对它们一知半解,很难搭建出高性能的服务器.接下来我们就以图形方式,解释这些概念之间的关系. 1 ...

  10. [oeasy]python0109_tty_打字头_电传打字机_字模_点阵字库

    点阵字库 回忆上次内容 上次回顾了 字符字型 的 进化过程 从 谷腾堡 活字 到 罗马正字 和 意大利斜体   罗马帝国战斗力的征服 和 基督教文化传播 使得 拉丁字符 在日耳曼语地区广泛传播 种葡萄 ...