题意描述

你被给了一个长度为 n n n 的序列,有两种操作:

  1. 找到一个数,把它除以 2 2 2,随后向上取整。
  2. 找到一个数,把它减去 b b b,随后与 0 0 0 取 max。

每种操作有使用次数上限,对于每个数每种操作只能使用一次,求经过若干次操作后,序列的最小总和。

简要分析

一眼 dp,然后假了,于是思维。

Character 1

一个简单的性质,对于每个数优先进行操作一随后进行操作二比先进行操作二再进行操作一更优

这个是显然的。

Character 2

数越大操作一对答案的贡献也就越大

这个更显然了。

所以我们排个序,这里默认从大到小。

Character 3

随后开始观察样例,发现最后一个样例十分有趣, 4 , 5 , 7 4,5,7 4,5,7 我们需要对 5 5 5 进行操作二,随后对 4 , 7 4,7 4,7 进行操作一才能得到最优答案。

针对这一特殊性质,我们展开举例。

不难发现,对于进行操作二的区间总是被进行操作一的区间所包围

通过观察,进行操作二的区间有且仅有一个。

通过上述三个性质,可以看出我们的操作大致是如下这样的:

接下来我们只需要枚举双操作区间的右端点即初次砍半区间的左端点,与初次砍半区间的长度即可。

代码实现

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>using namespace std;typedef long long ll;
const ll maxn = 1e5 + 7;
const ll INF = 1e9 + 7, MOD = 998244353;inline ll read() {char cCc;ll xXx = 0, wWw = 1;while (cCc < '0' || cCc > '9')(cCc == '-') && (wWw = -wWw), cCc = getchar();while (cCc >= '0' && cCc <= '9')xXx = (xXx << 1) + (xXx << 3) + (cCc ^ '0'), cCc = getchar();xXx *= wWw;return xXx;
}inline void write(ll xXx) {if (xXx < 0)putchar('-'), xXx = -xXx;if (xXx > 9)write(xXx / 10);putchar(xXx % 10 + '0');
}ll n, b, p, q, a[maxn], ans;
ll f[maxn], g[maxn], h[maxn], s[maxn];void solve() {n = read(), b = read(), p = read(), q = read();for (ll i = 1; i <= n; i++)a[i] = read();sort(a + 1, a + n + 1, greater<ll>()), ans = 1e18;for (ll i = 1; i <= n; i++)f[i] = f[i - 1] + max(0ll, (a[i] + 1) / 2 - b), g[i] = g[i - 1] + (a[i] + 1) / 2, h[i] =h[i - 1] + max(0ll, a[i] - b), s[i] = s[i - 1] + a[i];for (ll i = 0; i <= n; i++)for (ll j = 0; j <= n; j++)if (p >= i + j && q >= i && p + q - i <= n)ans = min(ans, f[i] + g[i + j] - g[i] + h[q + j] - h[i + j] + g[p + q - i] - g[q + j] + s[n] -s[p + q - i]);cout << ans << '\n';
}signed main() {
//    freopen("code.in","r",stdin);
//    freopen("code.out","w",stdout);ll T = read();while (T--)solve();return 0;
}

—— C l a u d e Z . \mathscr{ClaudeZ.} ClaudeZ.

[CF1799F] Halve or Subtract 题解相关推荐

  1. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  2. 2016ACM/ICPC亚洲区大连站题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/11 ABCDFHIJK A. Wrestling Match AC的C++语言程序: #include <ios ...

  3. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...

  4. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解

    "科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...

  5. [Cqoi2016] 密钥破解 Java 题解

    密钥破解 题目描述 一种非对称加密算法的密钥生成过程如下: 任选两个不同的质数 p ,q 计算 N=pq , r=(p-1)(q-1) 选取小于r ,且与 r 互质的整数 e 计算整数 d ,使得 e ...

  6. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践...

    1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...

  7. [ACM] 第八届西邮杯初赛题解

    Problem A: 加法变乘法 Time Limit: 10 Sec Memory Limit: 256 MB Description 已知X可以写成从1开始连续若干个整数的和, 现在要求把其中两个 ...

  8. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  9. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

最新文章

  1. 运维开发必会技能之一——虚拟机管理
  2. Asp.Net基础 - 4.ASP.Net揭秘之Input版自增 + 5.ViewState初探
  3. Linux中的popen-pclose
  4. 页面加载速度优化的12个建议
  5. 解决报错:错误1130- Host xxx is not allowed to connect to this MariaDb server
  6. SQL Server数据库管理常用SQL和T-SQL语句
  7. (转)C# WebApi 身份认证解决方案:Basic基础认证
  8. 屏上有一层紫色(正在找原因)
  9. 怎样在linux卸载java,卸载linux自带java,linux自带java
  10. VSCode中配置git(参数设置) - 教程篇【不推荐阅读】
  11. 微软python免费课程_微软再推免费在线Python教程 面向数据科学和机器学习初学者...
  12. Android TelephonyManager类
  13. 联邦快递认了:转运华为货件到美国,但称是“失误”!
  14. python 递归函数例子
  15. 美图秀秀怎么去水印-美图秀秀怎么去水印图片教程
  16. 时间序列分析(11)| 向量自回归模型(VAR模型)
  17. 半导体器件基础与二极管电路
  18. [12-22]XP系统城市更新[www.xp366.com]
  19. 【Java】蓝桥杯历届试题PREV(一)
  20. outlook中网址连接打不开解决办法

热门文章

  1. VR全景的应用以及优势
  2. mysql为什么不能卸载_mysql卸载无法重装怎么办?
  3. 进程间通信的方式及其特点
  4. c语言memmove头文件,memmove函数
  5. 微软邓力:驱动大数据人工智能多种应用的三类深度学习模式(附PPT下载)
  6. 夕べとても怖い夢を見た。
  7. 07. vue3+vite+qiankun搭建微应用前端框架,并接入vue3微应用
  8. 【AD】利用IPC封装向导创建PCB封装
  9. 【MySQL学习笔记】系列二:MySQL环境搭建(卸载、下载、安装、配置、登录)
  10. web服务器和框架之间的协议