题解P5483[JLOI2011]小A的烦恼((逗号真的坑啊
这是一道很难受的模拟
语文不好
题意都理解了很久
题目传送门
这是一篇很正经的题解~~~
进入正题
感觉容易忽略的地方
- 每一行的逗号要注意一下,,这道题在这个方面上是真的坑
- 最后一个文件最后没有多余的逗号,((多余指的是两个文件相连时补充的逗号
- 如果某个文件某一行没内容,但是又要输出那一行,那么就用逗号补充
总的来说就是逗号有坑
大概讲解一下本蒟蒻的变量名
int变量
maxn 所有文件中最大排数((要输出的排数
num[i][j] 第i个文件第j行逗号的数量
n[i] 每个文件的排数
max_num[i] 每个模块,对于所有排,逗号的最大个数
char变量
nam[i][] 第i个文件的文件名
h[i][j][] 存字符串,第i个模块的第j行
然后咱可以开始模拟了!!
先读入
for(int i=1;i<=T;i++){
scanf("%d",&n[i]);
maxn=max(n[i],maxn);
//对于所有的文件,要输出的排数就是所有文件里最大的排数
scanf("%s",nam[i]+1);
for(int j=1;j<=n[i];j++){
scanf("%s",th[i][j]+1);
int len=strlen(th[i][j]+1);
//因为每个字符串的长度只用一次,可以不用存下来,直接覆盖就好
for(int k=1;k<=len;k++){
if(th[i][j][k]==',') num[i][j]++;
//统计每一个文件的每一排有多少个逗号
}
max_num[i]=max(max_num[i],num[i][j]);
//统计每一个文件,对于所有排,最大的逗号数
//当文件名或某一行后面需要补充逗号时,根据max_num[i]来补充
}
}
然后输出
//为了方便输出,也可以先进行处理
//但本蒟蒻觉得麻烦
//就边输出边处理~~~
- 先输出每个文件的文件名
for(int i=1;i<=T;i++){
printf("%s",nam[i]+1);
for(int k=1;k<=max_num[i];k++) printf(",");
//补充逗号
//只要文件不是一列,那么就需要补充逗号
//若文件为一列,max_num[i]=0
//补充逗号的数量由max_num[i]((最大逗号数))来决定
if(i!=T) printf(",");
//若该文件不是最后一个文件,那么需要输出逗号隔开
}
- 文件名完了之后就是文件内容了
for(int j=1;j<=maxn;j++){//每一排输出了之后,再输出下一排
for(int i=1;i<=T;i++){
if(n[i]<j) for(int k=1;k<=max_num[i];k++) printf(",");
//某个文件的排数小于正在输出的排数
//那么这个文件从这一排开始,下面都没有内容
//如果某个文件这一排没有内容,补充逗号
else{
printf("%s",th[i][j]+1);
//若有内容,输出字符串
if(num[i][j]<max_num[i]){
int x=max_num[i]-num[i][j];
for(int k=1;k<=x;k++) printf(",");
}
//若某个文件的这一排的长度<该文件所有排中最大长度
//输出逗号来补充
}
if(i!=T) printf(",");
//若该文件不是最后一个文件,那么需要输出逗号隔开
}
printf("\n");
}
最后附上AC代码~~~
#include<bits/stdc++.h>
using namespace std;
int T;
int maxn;//maxn所有模块中最大排数
int num[107][107];//num[i][j]第i个模块第j行逗号的数量
int n[107];//n[i]每个模块的排数
char nam[107][107];//nam[i][]第i个模块的文件名
char th[107][107][107];//th[i][j][]存字符串,第i个模块的第j行
int max_num[107];//max_num[i]每个模块逗号的个数
//i 模块
//j 排数
int main(){
scanf("%d",&T);
for(int i=1;i<=T;i++){
scanf("%d",&n[i]);
maxn=max(n[i],maxn);
scanf("%s",nam[i]+1);
for(int j=1;j<=n[i];j++){
scanf("%s",th[i][j]+1);
int len=strlen(th[i][j]+1);
for(int k=1;k<=len;k++) if(th[i][j][k]==',') num[i][j]++;
max_num[i]=max(max_num[i],num[i][j]);
}
}
for(int i=1;i<=T;i++){
printf("%s",nam[i]+1);
for(int k=1;k<=max_num[i];k++) printf(",");
if(i!=T) printf(",");
}
//输出文件名
printf("\n");
for(int j=1;j<=maxn;j++){
for(int i=1;i<=T;i++){
if(n[i]<j) for(int k=1;k<=max_num[i];k++) printf(",");
else{
printf("%s",th[i][j]+1);
if(num[i][j]<max_num[i]){
int x=max_num[i]-num[i][j];
for(int k=1;k<=x;k++) printf(",");
}
}
if(i!=T) printf(",");
}
printf("\n");
}
return 0;
}
第一次写题解啊啊啊
一定要过啊啊