输入正整数n以及n个文件名,排序后按列优先的方式左对齐输出。假设最长文件名
有M字符,则最右列有M字符,其他列都是M+2字符。
题目要求行数尽量的短那么,就是列数尽量的长,所以我们可以算出列数为:
(maxcol - M) / (M + 2)
这样我们就可以得到代码:
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long int LL;
const int maxd = 105;
const int inf = 0x3f3f3f3f;
using namespace std;
const int maxcol = 60;
string filename[maxd];
void print(const string &s,int len,char extra)
{
cout<<s;
for(int i = 0;i<len - s.size();i++)
{
cout<<extra;
}
}
int main(void)
{
#ifdef MYLOCAKYACM
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
#endif // MYLOCA
int n;
while(cin>>n)
{
int maxsize = 0;
for(int i = 0;i<n;i++)
{
cin>>filename[i];
maxsize = max(maxsize,(int)filename[i].size());
}
print("",maxcol,'-');
int cols = (62 )/(maxsize+2),rows = (n-1)/cols+1;
//int cols = (maxcol - maxsize )/(maxsize+2)+1,rows = (n-1)/cols+1;
cout<<endl;
sort(filename,filename+n);
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<cols;j++)
{
int idx = rows * j + i;
if(idx < n)print(filename[idx], j == cols -1 ? maxsize :maxsize+2,' ');
}
cout<<endl;
}
}
return 0;
}