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