P10161 [DTCPC 2024] 小方的疑惑 10 [构造 + 背包DP]

news/2024/11/7 13:48:55/文章来源:https://www.cnblogs.com/chenwenmo/p/18531997

P10161 [DTCPC 2024] 小方的疑惑 10

Solution

  • 一开始看这题的时候,我们可能会觉得无从下手,这时不妨列出几种方案,计算它们的贡献,尝试得到一些启发。

  • 画来画去,发现无非就是并列和包含两种情况,并列就是 ()()()(),设它一共由 \(x\) 对括号组成,那么它的总贡献是 \(x\times (x+1)\div 2\)。包含就是 (...),这种情况下我们每在外面添加一对括号,贡献就会加一。

  • 欸?既然加一都有了,那如果不考虑长度 \(n\),无论如何我们都能凑够恰好 \(k\) 个合法括号子串。所以现在我们要考虑怎么样构造这个串,使得它长度在 \(n\) 之内,如果不足 \(n\),剩下我们随便放几个左括号补上就可以了。

  • 现在还是有个问题,我们直接判断合不合法比较困难。对于这种情况,可以考虑求最小长度,如果最小长度都大于 \(n\),那么肯定就不合法了。

  • 如何构造最优答案呢。我们思考一件事情,它要求最小答案,然后这些答案产生的贡献要恰好等于 \(k\),那这很可能是个背包啊。\(k\) 就是背包的容量,对于一个有 \(y\) 对括号的并列串,它的价值是 \(2\times y\),重量是 \(y\times (y+1)\div 2\),然后就相当于是完全背包求最小价值。

  • 那如果两个并列串直接合起来,肯定是不行的,因为贡献会跨串计算。例如我们要放两件物品 ()()()[][][],直接合并 ()()()[][][] 的话,贡献远不止 \(3\times (3+1)\div 2+3\times (3+1)\div 2\),如果我们这样子呢 [()()()][][],它的贡献刚好就是 \(3\times (3+1)\div 2+3\times (3+1)\div 2\),这是因为第一个中括号把里面的贡献和外面隔绝了。至此,各个物品的重量是可以直接累加的,价值也是可以直接累加的,于是我们进行一遍完全背包即可。

  • 为什么这样构造是最优的呢?感性理解一下,这样构造首先它没有一个多余的括号,其次,对于其他任何情况,都可以等价转换为这种方案。

  • 输出方案的话,只需要对于每个状态,记录转移过来的是哪个状态即可,具体见代码。

Code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;const int N = 1e5 + 5, inf = 1e9;int n, k, w[N], dp[N], pre[N];void print(int now) {if (!now) return;int cnt = (dp[now] - dp[pre[now]]) / 2;cout << "(";print(pre[now]);cout << ")";for (int i = 1; i < cnt; i++) cout << "()";
}void Solve() {cin >> n >> k;if (dp[k] > n) cout << "-1\n";else {print(k);for (int i = 1; i <= n - dp[k]; i++) cout << "(";cout << "\n";}
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);for (int i = 1; i <= 1000; i++) w[i] = i * (i + 1) / 2;fill(dp + 1, dp + 100000, inf);dp[0] = 0;for (int i = 1; i <= 1000; i++) {for (int j = w[i]; j <= 100000; j++) {if (dp[j - w[i]] + i * 2 < dp[j]) {dp[j] = dp[j - w[i]] + i * 2;pre[j] = j - w[i];}}}int T;cin >> T;while (T--) Solve();return 0;
}```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构——不可或缺的注册中心

从今天开始,我们将以Java后端技术为切入点,深入探讨微服务架构。本章的重点将聚焦于微服务中最关键的环节之一:服务发现与注册。文章将循序渐进,由浅入深,逐步引领你进入微服务的广阔世界。不论你是技术新手还是经验丰富的专家,我都希望通过这篇文章,能够为你提供独特而…

家有蓝猫

小年糕已经来了三天,昨晚不知怎么特别黏我,刚回家就开始跟着我。一直想让我摸摸它。晚上睡觉也趴到我身边喵喵叫,让我摸摸它。搞得我一夜醒了好几次。小家伙还想偷吃零食,我把猫条放在上面了。不是说小猫就喜欢纸箱子吗,给它准备的它连看都不看。这是在打哈欠,伸懒腰本文…

系统中电源的设计和选择 BOSHIDA acdc电源模块 BAL2.5-5W

系统中电源的设计和选择 BOSHIDA acdc电源模块 BAL2.5-5W1.确定所用电源的规格: 电源功率电源输出电压,输出端数电源尺寸2.使用标准模块设计系统时,请尽可能使用市场上通用的标准电源模块。这样可缩短设计和开发的时间,提高可靠性。3.尽地减少电源的输出端数一-般很容易买到…

c语言中函数体中的变量声明不能使用和形参相同的变量名

001、[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c #include <stdio.h>int max(int a, int b) // 创建一个名为max的函数 {int k = 100;if(a > b){return a;}else{return b;} }int main(void) {int x, y;puts("pl…

如何为管理者设计 360 评估调查题目?

宣布360 评估通常会使管理人员不稳定。同事、下属、管理层甚至客户和供应商通过预先制定的问卷来反馈。 360 评估可以采用多种形式:从 50 到 300 多个问题,例如使用开放式或封闭式问题。但抛开其形式不谈,当 360 评估与全球人力资源战略保持一致并受其驱动时,它的好处是多方…

[NOIP2022] 比赛 随机排列 部分分

看到最大值,考虑使用单调栈搞出 \([la_i, ra_i], [lb_i, rb_i]\) 表示这一段区间 \(i\) 是 \(a, b\) 的最大值。预处理是简单的。inline void init() {static auto f = [] (int a[], int l[], int r[]) -> void {static int stack[N], top;top = 0, a[n + 1] = 0x3f3f3f3f;…

鸿蒙接入Flutter3.22

配置环境变量配置HarmonyOS SDK和环境变量API12, deveco-studio-5.0 或 command-line-tools-5.0 配置 Java17 配置环境变量 (SDK, node, ohpm, hvigor)export TOOL_HOME=/Applications/DevEco-Studio.app/Contents # mac环境export DEVECO_SDK_HOME=$TOOL_HOME/sdk # command-l…

王慧文回归带队美团探索 AI 应用;对话音频开源模型 Hertz-dev:120 毫秒超低延迟丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

思通数科纸质档案扫描与识别与档案馆应用场景介绍

在传统档案馆中,纸质文件的处理和管理是一个重要且繁琐的环节,特别是面对庞大的历史资料库。思通数科的AI能力平台提供了一种高效的数字化解决方案,利用OCR技术将纸质档案中的信息自动提取并转化为数字文本,具体过程包括以下几个步骤: 1.扫描与图像预处理 首先,系统将纸质…

CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fusion

文章信息 标题 CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fusion 会议及时间 CVPR2023 主要内容 为了解决建模跨模态特征和分解期望模态特有和模态共有特征的挑战,本文提出了一种用于多模态图像融合的双分支Transformer-CNN架…