洛谷 P5483 [JLOI2011]小A的烦恼

题目链接

算法:暴力模拟

首先我们手动模拟一下,发现我们就是把原来的数据补齐成长方形表格即可

样例解释如下:

a1,b1,c1
a2,b2                                             

a1,b1,c1,d1
a2,b2
a3,b3,c3
a4

a ,  ,  ,b ,  ,  ,
a1,b1,c1,a1,b1,c1,d1
a2,b2,  ,a2,b2,  , 
  ,  ,  ,a3,b3,c3,
  ,  ,  ,a4,  ,  , 
  

然后我们开始模拟题意

对于每个读入的表格,统计最大的行元素数,然后在其他行末用逗号补齐

然后考虑把表格和答案逐行合并

如果答案表格的该行不为空,则直接加到末尾

否则添加与其他行逗号数量一样的逗号,然后加到末尾

输出时不要忘记标题

同时末尾多余逗号删去

代码如下:

#include <bits/stdc++.h>
using namespace std;

int read(){
    int x=0,flag=1; char c;
    for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    return x*flag;
}

const int N=205;
int n,mh,now;//行数最大值,  补齐要用的逗号数 
int h[N],l[N];//每张表格补齐后的行,列值 
char name[N][N];//表格名 
char ans[N][N*N],tmp[N][N];//答案  读入表格 
int len[N];//答案每行字符串长度 

int main() {
    scanf("%d",&n);
    for(int T=1;T<=n;T++){
        scanf("%d %s",&h[T],name[T]);
        for(int i=1;i<=h[T];i++) scanf(" %s",tmp[i]);//读入 
        
        for(int i=1;i<=h[T];i++){ 
            int sum=0; 
        
            for(int j=0,le=strlen(tmp[i]);j<le;j++) 
            if(tmp[i][j]==',') ++sum; 
        
            l[T]=max(l[T],sum); 
        }
        l[T]++;//统计行最多逗号数,即元素数 
        
        if(h[T]<=mh){//是否需要扩充答案表格 
            for(int i=1;i<=h[T];i++){
                int sum=l[T];
                for(int j=0,le=strlen(tmp[i]);j<le;j++){
                    ans[i][len[i]++]=tmp[i][j];//末尾添加 
                    if(tmp[i][j]==',') --sum;
                }
                while(sum) { ans[i][len[i]++]=','; --sum; }//补逗号 
            }
            for(int i=h[T]+1;i<=mh;i++){
                int sum=l[T];
                while(sum) { ans[i][len[i]++]=','; --sum; }//若该表行数小于答案表行数,直接补逗号 
            }
        }
        else{
            for(int i=1;i<=h[T];i++){
                if(len[i]==0){//答案表新添一行 
                    int sum=now;
                    while(sum) { ans[i][len[i]++]=','; --sum; }//补齐之前逗号 
                }
                int sum=l[T];
                for(int j=0,le=strlen(tmp[i]);j<le;j++){
                    ans[i][len[i]++]=tmp[i][j];//末尾添加 
                    if(tmp[i][j]==',') --sum;
                }
                while(sum) { ans[i][len[i]++]=','; --sum; }//补逗号 
            }
        }
        mh=max(mh,h[T]);//更新最大行数 
        for(int i=0,le=strlen(name[T]);i<le;i++){
            ans[0][len[0]++]=name[T][i];//标题 
        }
        for(int i=1;i<=l[T];i++) ans[0][len[0]++]=',';
        now+=l[T];//更新之前逗号数 
    }
    
    for(int i=0;i<=mh;i++){
        for(int j=0,le=strlen(ans[i])-1;j<le;j++) printf("%c",ans[i][j]);//输出, 不要最后位 
        puts("");
    }
    return 0;
}


猜你喜欢

转载自www.cnblogs.com/zzhzzh123/p/12208402.html
今日推荐