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. ServiceMesh、SideCar和Istio

    Service Mesh简介 Service Mesh直译过来就是服务网格,而他的架构就是一个个微服务组成的网络. Sidecar简介 Service Mesh中的节点就是Sidecar节点. sid ...

  2. 视觉语言跨模态特征语义相似度计算改进--表征空间维度语义依赖感知聚合算法 ACM MM

    论文链接:Unlocking the Power of Cross-Dimensional Semantic Dependency for Image-Text Matching (ACM MM23) ...

  3. 高通 LK阶段配置使用I2C-8

    以MSM8953为例. 原文(有删改):https://blog.csdn.net/qq_29890089/article/details/108294710 项目场景 因为项目需要,需要在高通MSM ...

  4. manim边学边做--MathTex

    上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,对于复杂的数学公式,可以使用MathTex类. MathTex类继承自SingleStringMathTex,在其基础 ...

  5. P3355 骑士共存问题题解

    题目链接:P3355 骑士共存问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题解: 棋盘问题考虑黑白染色成为二分图后做. 观察马的性质,可知一个点只能到一个异色点,所以,构造 ...

  6. Docker部署JavaWeb项目(Tomcat环境)

    一.环境准备 1.首先准备一台Centos 7的虚拟机并安装Docker. 2.准备好Tomcat.JDK的安装包以及该java项目的war包. 二.编写Dockerfile Dockerfile是一 ...

  7. Express手稿

  8. Mysql的Innodb和MyISAM引擎的区别

    区别项 Innodb MyISAM  事务  支持  不支持 锁粒度  行锁,适合高并发 表锁,不适合高并发  是否默认  默认  非默认  支持外键  支持外键  不支持  适合场景  读写均衡,写 ...

  9. C#——接口

    先来看看微软官方对接口的定义与说明. 接口定义协定. 实现接口的类或结构必须遵循它的协定. 接口可以从多个基接口继承,类或结构可以实现多个接口. 接口可以包含方法.属性.事件和索引器. 接口本身不提供 ...

  10. 解决方案 | Citrix Receiver无法正常启动的多种解决方案

    下面是个人在实践过程中总结的解决办法: 方案1:卸载Citrix Receiver(一般通过控制面板卸载,如果正常无法卸载则需要通过官方卸载软件ReceiverCleanupUtility软件卸载), ...