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;
		}
	}
}

                
            
        
浙公网安备 33010602011771号