题目大意:给出若干字符串对这些字符串排序之后,以列的优先级输出一个矩阵,对于每一列,如果是最后一列,那么必须输出maxLen个字符,如果不是最后一列,那么输出maxLen+2个字符。不够的用空格补齐。其中,maxLen是这若干个字符串中最长的那个字符串的长度。但是,每一行的字符数量不能超过60个。
思路:由题可知 maxLen + (column - 1) * (maxLen + 2) <= 60
化简可得 column <= 62/(maxLen + 2)
其中column是输出矩阵的列数,当然这里要向下取整
那么有了列数,就可以求出行数row了:row = ceil(n / column)
ceil代表向上取整。
之后就是暴力了。。。
喜闻乐见代码系列:
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
string ss[N];
void print(int x)
{
for(int i = 0 ; i < x ; ++ i) printf(" ");
}
int main(void)
{
while(scanf("%d",&n) != EOF)
{
//maxLen代表最长字符串的长度
int maxLen = 0;
//column代表输出结果的列数,row代表行数
int column , row;
//输入每一个字符串,并寻判断长度
for(int i = 0 ; i < n ; ++ i)
{
cin >> ss[i];
maxLen = max(maxLen , (int)ss[i].length());
}
//排序
sort(ss , ss + n);
//计算列数
column = 62 / (maxLen + 2);
row = ceil((double) n / column);
for(int i = 0 ; i < 60 ; ++ i) printf("-");
cout << endl;
for(int i = 0 ; i < row ; ++ i)
{
for(int j = i ; j < n ; j += row)
{
cout << ss[j];
if(j + row >= n) print(maxLen - (int)ss[j].length());
else print(maxLen + 2 - (int)ss[j].length());
}
cout << endl;
}
}
return 0;
}