洛谷 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;
}



posted @ 2020-01-18 10:26  zhuzihan  阅读(121)  评论(0编辑  收藏  举报