首页 > 其他分享 >P10161 [DTCPC 2024] 小方的疑惑 10 [构造 + 背包DP]

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

时间:2024-11-07 13:41:18浏览次数:1  
标签:10 now 背包 times 2024 括号 DTCPC div 贡献

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;
}```

标签:10,now,背包,times,2024,括号,DTCPC,div,贡献
From: https://www.cnblogs.com/chenwenmo/p/18531997

相关文章

  • 题解:P11248 [GESP202409 七级] 矩阵移动
    题目传送门题目大意给出一个nnn行mmm列的只包含0、1、?的矩......
  • 8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
    当前,各企业正面临前所未有的数据增量,不仅体现在数据规模的急剧上升,还体现在数据的类型多样性和产生速度的加快。数据体量大固然蕴藏着更大的潜力及可能性,但如何有效利用这些数据,解决实际问题、赋能业务增长,才是各企业发展的关键。因此,企业亟需搭建高效的数据处理与分析平台,以帮......
  • SpringBoot头条资讯的设计与实现ja10r 本系统(程序+源码+数据库+调试部署+开发环境)
    开题报告内容一、项目背景随着信息化社会的快速发展,人们对新闻资讯的需求日益多样化和即时化。传统的新闻媒体已难以满足用户个性化、快速获取信息的需求,因此,头条资讯类应用应运而生。本项目旨在设计和实现一个高效、智能的头条资讯系统,以满足用户对高质量、个性化资讯的迫切......
  • “2024年:普通人如何通过AI工具实现盈利?“
    前言:随着AI技术的飞速发展,人工智能已成为创造财富的新引擎。本文将带你探索如何利用AI技术,在现代社会中开辟新的盈利渠道。从个人创业到企业转型,我们将一览AI带来的赚钱机遇,为你在智能时代的财富增长提供思路和策略。1、信息差模式现在市场上AI应用工具很多,不是所有人都......
  • AI绘画本地版ComfyUI终于来了!(一键整合包,免安装更方便)附各种工作流及模型文件1000张工
    前言:comfyUI自从面世以来,就以一种潜力股的姿态快速流行了起来,越来越多的小伙伴开始使用comfyUI。也许你一开始会被comfyUI密密麻麻的“线路”吓到,但其实comfyUI也没那么复杂,并且好处多多。今天给大家分享一下AI绘画进阶工具ComfyUI,作为StableDiffusionWebUI的进阶版工......
  • NOIP2024集训Day71 贪心
    NOIP2024集训Day71贪心B.[CCO2015]饥饿的狐狸显然的,要求出最大美味值,应该先交错吃温度最大的和最小的饼干。所以我们给所有饼干按照温度排序,交替选择左右端点吃,如果喝水能够达到更大那就先喝水再吃,反正水管够。分两种情况,即左右端点谁先开始,再取个\(\operatorname{max}\)。......
  • # 20222326 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验内容一、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;(2)使用超级巡警脱壳机等脱壳软件,......
  • 2024 csp 第一轮游记
    Day-1在本校考试,太棒了?cxm说要把我们硬控到晚自习结束!然后跑啦,回家收拾文具!Day1早上csp-jjx安排阶梯教室是真的阴间,座位还不够隔着做,桌板还是斜的。30分钟打摆,检查一遍直接睡觉。上厕所被xsj说了一顿......
  • 2024 csp 第二轮游记
    Day-7~Day-1考前信心赛考OIFC模拟?信心非常的足。今年应该能提高一等吧。Day1上午J组考试,压着时间进考场,老师说可以两个小时之后就可以提前交卷了。开题...10:20切完,检查检查。10:30老师告诉我不能提前交卷,蚌埠住了。(后面来的巡考员听了监考员的询问后还非常霸气的来......
  • 华为OD机试真题-数组二叉树码-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述二叉树也可以用数组来......