刘汝佳紫书上的例题,思路较为简单
原题:
大致题意:有若干个样例,每个样例有n个字符串,样例第一行输入n,接下来n行每行输入一个字符串,最后按以列优先的方式按字典序从小到大输出字符串。每行字符不能超过60个,要求输出行数尽量小。同时,前C-1列占位Max+2,第C列占位Max。Max是最长字符串长度。
思路:在输入的同时更新Max值,由于行数要尽量小。所以列数应当尽量大。通过Max与60这个限制来算出列数与行数,在输出时边输出边计算下标。
代码:
#include<iostream>
#include<algorithm>//sort排序函数
#include<string>
#include<sstream>
#include<vector>
#include<iomanip>//控制输出格式
#include<cmath>//ceil向上取整函数
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
while(cin>>n)
{
vector<string> dict;
dict.clear();
int MAX = -10;
for(int i=0;i<n;i++)
{
string cur;
cin>>cur;
dict.push_back(cur);
MAX=max(MAX,(int)cur.length());//更新MAX
}
int col,row,remainder,N=0;
col=(60-MAX)/(MAX+2)+1;
row=ceil(1.0*n/col);
remainder=n%row;
if(remainder==0)
{
remainder=row;
}
sort(dict.begin(),dict.end(),less<string>());//按字典序排序
for(int i=1;i<=60;i++)
{
cout<<"-";
if(i==60)
{
cout<<endl;
}
}
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(j!=col-1||remainder==row)
{
if(j<col-1)
{
cout<<left<<setw(MAX+2)<<setfill(' ')<<dict[j*row+i];
}
else
{
cout<<left<<setw(MAX)<<setfill(' ')<<dict[j*row+i]<<endl;
}
}
else//分类讨论当最后一列字符串个数不为行数时的输出情况
{
if(i>remainder-1)
{
cout<<endl;
continue;
}
cout<<left<<setw(MAX)<<setfill(' ')<<dict[j*row+i]<<endl;
}
}
}
}
return 0;
}