Unix Is命令(UVa 400)详细解答

news/2024/6/18 21:33:24 标签: 算法, 动态规划, 贪心算法, awk

题目:
输入正整数n 以及n 个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M 字符,则最右边有M 字符,其他列都是M+2 字符。

题目分析:
有n个文件名,其中最长的文件名有M个字符,一下面输入为例,最长的是Mr._French(共有10个字符),然后最右边的一列,占M个字符宽,不够的用字符’ '占满,其他列都是M+2个字符,所有列都要左对齐,并且要按字典序。

输入:
19
Mr._French
Jody
Buffy
Sissy
Keith
Danny
Lori
Chris
Shirley
Marsha
Jan
Cindy
Carol
Mike
Greg
Peter
Bobby
Alice
Ruben

输出(注意上边一共60个’-’)每一行左对齐,所有文件名按字典序排列

在这里插入图片描述
解题思路:

我们首先要在N个文件名中找出含字符数最多的,并设为M。这个我们可以通过max函数完成,每次比较string[i]。然后我们要通过M算出需要多少列,最顶上的’-‘共有60个,代表最多有60个字符,最右边的一列占M个字符,其他列占M+2个字符,所以设需要列为y=(60-M)/(M+2)+1,即先减去最右边的列所占的字符数,然后除以M+2算出其他有多少列,最后加上最右边的一列。设行数为x,x=(n-1)/y+1,解释以下为什么是n-1,正常思路,我们用总个数n➗y总列数,可以得到能占满多少行,如果有余数我们就+1,所以我们可以得出x=n/y+1,但是当整除的时候我们就不需要在+1,所以我们通过n-1使得即使n能整除,-1后也不能,即使n-1能整除,那么通过+1,第n个文件名也有一行可以占。最后就是输出,我们用print()方法,传入文件名,这列所占字符数(M或M+2),以及’ '。在遍历string数组时我们要先用sort方法排成字典序。并且遍历时要判断是否为最右边的那一列,如果是,print()传入M,不是传入M+2。

代码:

#include <bits/stdc++.h>
using namespace std;

const int maxcol=60;//最多有60个' '单个字符构成一行
const int maxn=100+5;//最多读入100个文件名
string filenames[maxn];//将文件名存入string数组中

void print(const string &s,int len,char extra)//传入文件名,以及这一列的长度
{
    cout<<s;
    //利用for循环,打出剩余的' '
    for(int i=0;i<len-s.length();i++)
    {
        cout<<extra;
    }
}

int main()
{

    int n;
    while(cin>>n)
    {
        int M=0;
        for(int i=0; i<n; i++)
        {
            cin>>filenames[i];
            M=max(M,(int)filenames[i].length());//找到最多字符的文件名
        }
        //计算行和列
        int cols=(maxcol-M)/(M+2)+1;
        int rows=(n-1)/cols+1;
        //  因为我们首先要打印60个' ',所以在print()方法传入的参数extra,这样更加方便
        print("",60,'-');//打印最上面的'-----'
        cout<<endl;
        sort(filenames,filenames+n);
        for(int r=0; r<rows; r++)
        {
            for(int c=0; c<cols; c++)
        {
            int idx=c*rows+r;
            if(idx<n){
                print(filenames[idx],c+1==cols?M:M+2,' ');//如果是最后一一列只打印M个字符,其他列打印M+2个字符
            }
        }
        cout<<endl;//不要忘记换行
        }
    }

    return 0;
}

感谢观看,多多点赞!


http://www.niftyadmin.cn/n/860384.html

相关文章

超级楼梯(递推)

题目: 有一楼梯共M级&#xff0c;刚开始时你在第一级&#xff0c;若每次只能跨上一级或二级&#xff0c;要走上第M级&#xff0c;共有多少种走法&#xff1f; 输入: 输入数据首先包含一个整数N&#xff0c;表示测试实例的个数&#xff0c;然后是N行数据&#xff0c;每行包含一…

铺方格(升级版递推)详细解答

题目: 有一个大小是2xN的网格,现在需要用2种规格的骨牌铺满,骨牌的规格分别是2x1和2x2,请计算一共有多少铺设的方法。(从左向右铺) 输入: T组数据,N网格列数 (0<N<50) 输出: 所有方案m Sample Input 1 3 2 Sample Output 1 5 3 解题思路: 这道题和超级楼梯有异曲同工…

LIS最长上升子序列

LIS:从一串数字序列,找出连续递增的子序列,并且要求子序列最长! 举例: 一段序列:1,6,2,3,7,5,9,4,11 最长上升子序列为:1,2,3,7,9,11 那么我们如何通过代码实现呢? 我们需要一个数组f,然后通过f记录每一个数字的最大上升子序列。 初始时每一个f[i]1,因为那怕找不到任意一个子…

LCS最长公共子序列

最长公共子序列:顾名思义从两段序列中选出,其中连续并且相同的子串 举例 a串:1 5 7 9 6 3 b串:1 6 3 2 1 5 最长公共子序列 c串:1 6 3 我们如何实现呢? (假设a串有n个数字,b串有m个数字) 我们需要一个二位数组f,通过这个二维数组存放 f(i,j) f(i,j)含义:表示a串前i个数字,和b串…

01背包问题相关优化大全(二维到一维)

下面是普通版本的01背包代码! int dp[105][1005];for(int i1;i<m;i)for(int jt;j>0;j--){if(j>w[i]){dp[i][j]max(dp[i-1][j-w[i]]v[i],dp[i-1][j]);}else{dp[i][j]dp[i-1][j];}}滚动数组优化二维01背包 我们可以看到dp数组需要很大,至少超过2行! 那么我们想一想可不…

完全背包问题(详细解答)

首先完全背包问题需要01背包问题做铺垫,如果读者01背包问题没有解决,一定要理解之后,在看完全背包问题,包括01背包的优化! 这里是01背包 这里是01背包的全部优化 好,我们开始完全背包! 完全背包定义 有N种物品和一个容量为V的背包&#xff0c;每种物品都有无限件可用。第i种物…

快速幂+矩阵优化斐波那契数列(超详细教程)

文章目录前言一、快速幂二、矩阵优化斐波那契数列1.矩阵相关知识2.斐波那契数列用矩阵表示3.O(log2n)的斐波那契数列三、全部实现代码前言 我们首先讲解快速幂,然后利用快速幂优化矩阵乘法,将O(n)算法变为O(log2n),紧接着我们用矩阵实现斐波那契数列! 一、快速幂 通常我们算…

单调队列(滑动窗口问题)

单调队列定义 队内元素是单调的,递增或递减。 单调队列性质 1、队尾既可以执行入队操作,也可以执行出队操作, 但队头只能执行出队操作 单调队列解决滑动窗口最大最小值问题 题目: 有一个长为 n的序列 a&#xff0c;以及一个大小为 k 的窗口。现在这个从左边开始向右滑动&…