vlambda博客
学习文章列表

C++与STL部分竞赛题目举例(1):Unix is 命令

C++与STL部分常用函数已经悉数介绍

接下来将列举5道例题。



例题1:Unix Is 命令

输入正整数n以及n个文件名, 排序后按列优先的方式左对齐输出。假设最长文件名有M字符,则最右列有M字符,其它列都是M+2字符。设一行60字符。
样例输入:略(可由样例输出推出)
样例输出:

STL分析:看到排序,考虑使用STL中的sort
难点分析:按列优先是难点,考虑计算行列,再使用行列关系进行输出

代码展现:
#include <iostream>#include <algorithm>#include <string>using namespace std;
const int maxcol = 60;const int maxn = 100 + 5;string filenames[maxn];
void print(const string &s, int len){ cout << s; for (int i = 0; i < len - s.length(); i++) cout << ' ';}int main(){ int n; cin >> n; int M = 0; for (int i = 0; i < n; i++) { cin >> filenames[i]; M = max(M, (int)filenames[i].length()); //STL max } //计算列数和行数 int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1; sort(filenames, filenames + n); //STL sort; 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 == cols - 1 ? M : M + 2); //巧妙运用问号表达式 } cout << endl; } return 0;}
测试结果:(为方便,采用了别的样例)