Qualification Round 2020 - Code Jam 2020B

B Nesting Depth (5pts, 11pt)

说实话,看到这个题,一下子就想起了之前coursera,pku的C语言基础里面的括号匹配问题,不过这个题是让你生成括号;

问题描述

给定T个字符串,其中包含1-9的数字,生成将这些数字包含的最短的完全匹配括号,比如1221,将每个数字完全包含的括号可以是(1)((2))((2))(1),但是正确的答案应该是(1(22)1);
首先把第一个数字s[0]前半部分括号生成,我们有 a[0]…a[s[0]-1]=’(’;a[s[0]]=s[0];
然后递归搜索s[1]…s[i+1];通过观察,最短的完全匹配括号有如下的性质:
1.当s[i]>s[i-1]时,我们需要在生成字符串的s[i-1]到s[i]的位置上补上’(’;即,
a[s[i-1]…a[s[i]-1]=’(’; a[s[i]]=s[i];
2.s[i]=s[i-1]时,此时不用补上括号,a[s[i-1]+1]=s[i];
3,s[i]<s[i-1]时,我们需要在生成字符串的s[i-1]到s[i]的位置上补上’)’;即,
a[s[i-1]…a[s[i]-1]=’)’; a[s[i]]=s[i];

代码如下:

#include<iostream>
#include<stdlib.h>
#include<string>
#include<stdio.h>
using namespace std;
char a[1000];
int b[1000];
char c[1000];
int n;
int pairs(int i,int j){
if(i>n){
  return 0;}
  else {
    if(b[i]>b[i-1]){
            int r=j+1;
        for(int k=0;k<b[i]-b[i-1];k++){
            a[r]='(';
            r=r+1;}
        j=j+b[i]-b[i-1]+1;
        a[j]=c[i];
        pairs(i+1,j);}
    else if(b[i]==b[i-1]){
        a[j+1]=c[i];
        pairs(i+1,j+1);}
    else{
        int v=j+1;
        for(int k=0;k<b[i-1]-b[i];k++){
            a[v]=')';
            v=v+1;}
        j=j+b[i-1]-b[i]+1;
        a[j]=c[i];
        pairs(i+1,j);}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
{cin>>b[i];
    c[i]=b[i]+'0';}
    for(int i=0;i<b[0];i++){
    a[i]='(';}
    a[b[0]]=c[0];
    pairs(1,b[0]);
    for(int i=0;i<sizeof(a);i++){
    cout<<a[i];}
    }

当然这个代码是不能ac的,得更改一下输入输出格式;其他几个有空再更;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值