Loading

Unix ls命令(UVA 400)

题目大意

输入一个数字n,紧接n行每行一个单词。

要求输出60个'-',随后要求用最少行输出单词,其中设单词最长有M个字符,则最后一列有M个字符,其他行都有M+2个字符。

分析

这道题想明白了十分简单,或许最困难的地方是行列数的确定。其实题目中给出了明确的要求

  • 最少的行列
  • 由60个字符构成

那么这道题就有思路了,我们可以求出最长单词的长度,随后就可以根据最后一列有M个字符,其他行都有M+2个字符求出来有多少列,进而就能求出来有多少行。

#include<vector>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;

int main() {
	int n = 0;

	string str;
	vector<string> filenames;
	while (cin>>n)
	{
		filenames.clear();
		int m = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> str;
			filenames.push_back(str);
			m = max(m, (int)str.length());
		}

		int cols = (60 - m) / (m + 2) + 1;
		int rows = (n - 1) / cols + 1;
		for (int i = 0; i < 60; i++)
		{
			cout << "-";
		}
		cout << endl;
		sort(filenames.begin(), filenames.end());//按照首字母排序

		for (int i = 0; i < rows; i++)
		{
			for (int j = 0; j < cols; j++)
			{
				//输入都是一行一行输出的
				int idx = rows * j + i;
				if (idx<n)
				{
					cout << filenames[idx];
					int max_length = j == cols - 1 ? m : m + 2;
					int blank_length = max_length - filenames[idx].length();
					for (int k = 0; k <blank_length;k++)
					{
						cout << " ";
					}
					
				}
			}
			cout << endl;
		}

	}
}
posted @ 2021-02-15 18:04  翙翙其羽  阅读(64)  评论(0)    收藏  举报