版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/86295685
欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109
题目描述
题意解析
输入正整数N以及N个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M个字符,则最右列有M个字符,其他列都是M+2个字符,不够的则在末尾补空格字符。要求输出的每行的总字符数不超过60,且行数最小。
算法设计
可以用vector<string>files
来存储每组输入的文件名,输入过程中用M来表示最长文件名的字符数,输入完毕用sort
函数进行排序。需要确定输出的行数R和列数C。由于最右列有M个字符,其余列每列M+2个字符,每行最多60个字符且要求行数最小,则求列数C的公式为
假设有N个文件名,则求行数R的公式为
行数列数确定好后,算法就很容易编写了。
C++代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
while(cin>>N){
string input;
vector<string>files;//存储文件名
int M=0;//存储最长文件名的字符数
while(N--){
cin>>input;
M=max(M,(int)(input.size()));
files.push_back(input);
}
sort(files.begin(),files.end());//排序
int C=1+(60-M)/(M+2),R=(files.size()+C-1)/C;//求列数C和行数R
for(int i=0;i<60;++i)//输出60个'-'字符
printf("-");
puts("");//换行
for(int i=0;i<R;++i){//输出R行
for(int j=0;j<C;++j){//每行输出C列
if(i+j*R>=files.size())
continue;
printf("%s",files[i+j*R].c_str());
int len=(j==C-1)?M:M+2;
for(int k=0;k<len-files[i+j*R].size();++k)
printf(" ");
}
puts("");//换行
}
}
return 0;
}