zoj1016

這道題看題目條件看了好久,第一個p方式還是挺好理解的,就是在右括號的左邊有幾個左括號就輸出幾,第二個w方式的話一開始一直沒看懂a是幹嘛的,後來發現並沒有什麼用,它的意思就是與右括號匹配的左括號裏有幾個右括號本身也包括在內。
知道了這個之後我就模擬了一下,先根據P生成括號,然後從右向左搜索遇到第一個右括號就從它開始向左搜索,記錄右括號的個數,直到遇到左括號爲止,這時輸出個數然後把左括號標記爲‘*’。

#include<iostream>
#include<stdio.h>
using namespace std;
int Pway[100],Wway[100];
char  Parentheses[1000];
int ans;
void Translate(int i){
    ans=0;
    for(int j=i;j>=0;j--){
        if(Parentheses[j]==')'){
            ans+=1;
        }
        if(Parentheses[j]=='('){
            printf("%d",ans);
            Parentheses[j]='*';
            return;
        }
    }
}
int Generate(int n){
    int cnt,j;
    for(cnt=0;cnt<Pway[0];cnt++){
        Parentheses[cnt]='(';
    }
    Parentheses[cnt]=')';
    j=cnt+1;
    for(int i=1;i<n;i++){
        if(Pway[i]>Pway[i-1]) {
            //  cout<<"i:"<<i<<endl;
            for(;j<=Pway[i]-Pway[i-1]+cnt;j++){
                Parentheses[j]='(';
                //          cout<<"Pway[i]-Pway[i-1]+cnt:"<<Pway[i]-Pway[i-1]+cnt<<endl;
            }
            Parentheses[j++]=')';
            cnt=j-1;
        }
        else{
            Parentheses[j++]=')';
            cnt=j-1;
        }
    }
    return j;
}
int main()
{
//  freopen("input.txt","r",stdin);
    int n,cnt,T;
    int step;
    cin>>T;
    while(T--){
        cin>>n;
        cnt=0;
        step=0;
        for(int i=0;i<n;i++){
            scanf("%d",Pway+i);
        }
        cnt=Generate(n);
        for(int i=0;i<cnt;i++){
            if(Parentheses[i]==')'){    
                if(step!=0) {
                    printf(" ");
                }
                else step=1;
                Translate(i);

            }
        }
        printf("\n");
    }
}
發佈了35 篇原創文章 · 獲贊 0 · 訪問量 8454
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章