Unix ls

也可以查看我的个人博客
题目链接

题目大意:给出若干字符串对这些字符串排序之后,以列的优先级输出一个矩阵,对于每一列,如果是最后一列,那么必须输出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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值