2021牛客寒假算法基础集训营1 | 括号

题意

牛客网
构造一个非空括号字符串,要求正好包含k个合法括号对
字符串长度不能超过十万

* 0 ≤ k ≤ 1 0 9 0\leq k \leq 10^9 0k109

思路

看到这个k的数据范围和字符串长度要求,我们知道不能一个劲怼括号,否则会超出长度限制

那么我们先来思考一个问题:
一个长度为n的字符串,如何出现最多的括号对?(为了方便描述,我假定n为偶数)
答案是把字符串一分为二,左边全是左括号,右边全是右括号,这样我们就得到了 ( n 2 ) 2 (\frac{n}{2})^2 (2n)2个括号对。

把上面这个过程反过来,我们需要正好 k k k个合法括号对,那么我们先令 t = k ( 向 下 取 整 ) t=\sqrt{k} (向下取整) t=k ,字符串左边放入 t t t个左括号,右边放入 t t t个右括号,那么我们就得到了 t 2 t^2 t2个括号对。
因为 t t t是向下取整的,所以我们可能会漏掉一些括号对,这时候需要把漏掉的括号对补上

我们需要补上 d e l t a = k − t 2 delta = k-t^2 delta=kt2个括号对,因为字符串右边有 t t t个右括号,所以我们每在字符串左边加一个左括号就会增加 t t t个括号对
在字符串左边加上 d e l t a / t ( 向 下 取 整 ) delta / t(向下取整) delta/t个括号对以后,我们还需要补上 d e l t a % t delta \% t delta%t个括号对。这时候不能再去字符串左边加左括号,因为这么做得到的括号对会大于 k k k。这样,我们就要从字符串的右边入手。

字符串右边现在是 t t t右括号,我们需要补上的括号对又小于 t t t,所以我们可以从右往左数 d e l t a % t delta \% t delta%t个位置,从那里插入一个左括号,这样整个字符串就增加了 d e l t a % t delta \% t delta%t个右括号,得到了刚好 k k k个合法括号对。

例子
k = 7 k=7 k=7,先生成字符串 (()),再从字符串左边补上 d e l t a / t = 2 delta / t=2 delta/t=2个括号对,变成((()),还差一个括号对,从字符串从右往左数第 d e l t a % t delta \% t delta%t个位置插入左括号,得到((()(),正好7个合法括号对

代码

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int k;
    cin >> k;
    //如果k=0则输出包含0个合法括号对的非空括号字符串
    if (k == 0) {
        cout << ")";
        return 0;
    }
    //k开根号先生成一些括号对
    int t = (int) sqrt(k);
    //实际需要的括号对和当前括号对数量的差值
    int delta = k - t * t;
    //在最左边每添加一个"("就会多出t对合法括号对
    for (int i = 0; i < delta / t; ++i) {
        cout << "(";
    }
    //原有的t个"("
    for (int i = 0; i < t; ++i) {
        cout << "(";
    }
    //加了整数倍t个括号对以后还差delta个括号对
    delta = delta % t;
    //先输出原有的t个")"
    //从右往左数,差几个括号对就从第几个位置插入一个"("
    //如果不差括号对就不再插入(这里放在了最后一个)
    for (int i = 0; i < t + 1; ++i) {
        if (i == (t - delta))cout << "(";
        else cout << ")";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值