Problem - 1703G - Codeforces

有n个箱子。第i个箱子里有ai个硬币。你需要按顺序打开所有n个箱子,从箱子1到箱子n。

你可以用两种类型的钥匙来打开箱子。

一把好钥匙,使用它需要花费k个硬币。
坏钥匙,不需要花费任何金币,但会将每个未打开的箱子里的所有金币减半,包括它要打开的箱子。减半的操作将使每个被减半的箱子减至最接近的整数。换句话说,用一把坏钥匙打开i号箱子会做ai=⌊ai2⌋,ai+1=⌊ai+12⌋,...,an=⌊an2⌋。
任何钥匙(包括好的和坏的)在使用后都会断掉,也就是说,它是一次性的使用。
你总共需要使用n把钥匙,每个箱子一把。最初,你没有金币,也没有钥匙。如果你想使用一把好钥匙,那么你需要购买它。

在这个过程中,你可以负债;例如,如果你有1个硬币,你可以购买一把价值k=3个硬币的好钥匙,你的余额将变成-2个硬币。

请找出从1号箱子到n号箱子的顺序打开所有n个箱子后,你能拥有的最大数量的硬币。

输入
第一行包含一个整数t(1≤t≤104)--测试案例的数量。

每个测试案例的第一行包含两个整数n和k(1≤n≤105;0≤k≤109)--分别为箱子的数量和一把好钥匙的成本。

每个测试案例的第二行包含n个整数ai(0≤ai≤109)--每个箱子里的硬币数量。

所有测试案例的n之和不超过105。

输出
对于每个测试案例,输出一个单一的整数--按照从箱子1到箱子n的顺序打开箱子后所能获得的最大硬币数。

请注意,有些测试案例的答案不适合32位整数类型,所以你应该在你的编程语言中至少使用64位整数类型(如C++的long long)。

例子
inputCopy
5
4 5
10 10 3 1
1 2
1
3 12
10 10 29
12 51
5 74 89 45 18 69 67 67 11 96 23 59
2 57
85 60
输出拷贝
11
0
13
60
58
备注
在第一个测试案例中,一个可能的策略是如下的。

用5个金币购买一把好钥匙,然后打开1号箱子,得到10个金币。你目前的余额是0+10-5=5个硬币。
用5个硬币买一把好钥匙,然后打开箱子2,得到10个硬币。你目前的余额是5+10-5=10个硬币。
用一把坏钥匙打开3号箱子,由于使用了坏钥匙,3号箱子的硬币数变成⌊32⌋=1,4号箱子的硬币数变成⌊12⌋=0,你现在的余额是10+1=11。
使用一把坏钥匙,打开4号箱子。由于使用了一把坏钥匙,4号箱子里的硬币数量变成了⌊02⌋=0,你现在的余额是11+0=11。
在这个过程结束时,你有11个硬币,这可以证明是最大的。

题解:

根据每次用坏钥匙,当前位及后面所有宝箱金币数均减半(代表后面不会再用好钥匙了,因为除了2,比起以前再用好钥匙会更小)

再结合数据范围1e9,顶多32次后,i + 32后的宝箱就全为0了

那么我们直接暴力枚举再0~n位,每个i后顶多32次就结束了,是可行的

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define int long long
//1 1 3 3 3
int a[300050];
int s[300050];
int b[300050];
void solve()
{int n,k;cin >> n >> k;for(int i =  1;i <= n;i++)cin >> a[i];int s = 0;int ans = 0;for(int i = 0;i < n;i++){int ss = s;for(int j = i+1;j <= min(n,i+32);j++){int cnt = a[j];cnt >>=j - i;ss += cnt;}ans = max(ss,ans);s += a[i+1] - k;}ans = max(ans,s);cout<<ans<<"\n";}
signed main()
{int t = 1;cin >> t;while(t--){solve();}
}
//2 5
//3
//9 7 //2  3 4 3

G. Good Key, Bad Key(暴力)相关推荐

  1. python 学习笔记 - for循环: 字典遍历, 分别打印key, value, key:value

    #遍历字典, 分别打印key, value, key:value emp = {'name':'Tom', 'age':20, 'salary' : 8800.00}for k in emp.keys ...

  2. 出圈问题(java)-----n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少?

    出圈问题---n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少? java版 1.n个人围成一圈,说明它是重复循环的,头就是尾. 2.每次数key或者key的倍数, ...

  3. candidate key, primary key, superkey的区别

    理解前觉得很复杂 理解后觉得很简单 简单的东西简单记录 他们的共同点是:都能确定一个relation里每个tuple的唯一性 关系: superkey包括candidate key, candidat ...

  4. #{key}和${key} 取值的区别

    mybatis中 #{key}和${key} 取值的区别 mapper映射文件 <select id="selectUser" resultType="com.rp ...

  5. can not load key value key was removed or redis-server went away 关于spring 整合redis 以及保存到redis

    spring 整合redis 1. 引用依赖 <!--Redis--> <dependency><groupId>org.springframework.boot& ...

  6. G. Good Key, Bad Key(思维)

    链接: There are nn chests. The ii-th chest contains aiai coins. You need to open all nn chests in orde ...

  7. codeforce:G. Good Key, Bad Key【贪心】

    分析 有两个操作,我们不知道选哪个 我们就考虑先a后b和先b后a # x y # good and bad: x + y // 2 - k # bad and good: x // 2 + y // ...

  8. 【原创】浅析密码学在互联网支付中的应用|RSA,Hash,AES,DES,3DES,SHA1,SHA256,MD5,SSL,Private Key,Public Key...

    一)概述 什么是互联网支付? 当支付遇到互联网,一场革命自然不可避免.成为现实的是传统的现金支付已经"退居二线",各种在线支付方式成为人们日常消费的主要支付方式.银行推出的网银以及 ...

  9. CHIL-ORACLE-主外键约束(primary key / foreign key)

    主键约束 要求主键列数据唯一,并且不允许为空 外键约束 用于量表建立关系,需要指定引用朱彪的那列(主表必须是主键)1.主键约束 ( primary key )--例如1:create table te ...

最新文章

  1. TCP UDP HTTP 的关系和区别
  2. linux ctrlc 退出循环_linux按行读取 (while read line与forloop)
  3. 解决页面上JS文件加载过慢问题
  4. Android之Handler
  5. 分享一个selenium jar包 的下载地址,各版本都有,包括selenium-server-standalone.jar、selenium、selenium-server
  6. 如何一键查看你的QQ/绑定了多少应用?
  7. 学习笔记1-【计算机组成原理】-【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
  8. 易基因 - 外泌体let-7d-3p和miR-30d-5p作为宫颈癌及其癌前病变无创筛查的诊断标志物|早期筛查
  9. OFDM学习、编程实现
  10. 智慧城市 宠物管理系统的重要性 --“遛狗不牵绳-违法”
  11. 开发用台式机还是笔记本_您应该开发台式机还是Web应用程序?
  12. 用于CTF(MISC)的kali虚拟机更改过程记录
  13. Adobe XMP SDK项目应用(续1)
  14. 大学生php实训总结_PHP实训心得总结
  15. activiti使用详解
  16. 程序员该该怎么样转型 5G 开发呢?
  17. python爬虫--cookie、防盗链、代理
  18. 2023年山东最新建筑八大员(电气施工员)模拟真题题库及答案
  19. 不小心点了计算机一键还原怎么操作,怎么一键还原,详细教您怎样还原电脑系统...
  20. 新浪微博客户端详解(一)

热门文章

  1. 微信小程序优惠劵功能(包含用户需求,axure原型设计,数据库设计,后台功能,微信小程序功能)
  2. python取随机小数_python生成2位小数点的随机数
  3. 自制的MATLAB拼图游戏GUI界面版详解(下篇)
  4. JavaScript设计模式都有哪些?
  5. 服务器一直显示初始化,服务器一直初始化内存
  6. inches 和像素的换算
  7. 【计算机网络】网络通信协议
  8. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)
  9. 单片机—外部中断与定时器 学习笔记
  10. 实战案例讲解:用户画像如何应用?