UVa 400 Unix Is

题意:给出n个字符串,按照字典序排列,再按照规则输出。

===学习的紫书,题目意思很清楚,求列数和行数最开始看的时候木有看懂啊啊啊

列数:即为(60-M)/(M+2)+1;即为先将最后那一列减去,算普通的有多少列,算完了再加上最后一列

行数:可以用紫书里面的(n-1)/cols+1,也可用ceil函数

再将坐标对应成第几个字符串算出来,是像这个图的箭头标示的从上到下-

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<math.h>
 6 using namespace std;
 7
 8 const int maxcol=60;
 9 const int maxn=100+5;
10 string filenames[maxn];
11
12 void print(const string &s,int len,char extra)
13 {
14     cout<<s;
15     for(int i=0;i<len-s.length();i++)
16     cout<<extra;
17 }
18
19 int main()
20 {
21     int n;
22     while(cin>>n)
23     {
24         int M=-5;
25         for(int i=0;i<n;i++)
26         {
27             cin>>filenames[i];
28             M=max(M,(int)filenames[i].length());
29         }
30         int cols,rows;
31         cols=(maxcol-M)/(M+2)+1;
32         rows=ceil((1.0)*n/cols);
33
34         sort(filenames,filenames+n);
35         print("",60,‘-‘);
36         printf("\n");
37
38         for(int i=0;i<rows;i++)//行数
39         {
40             for(int j=0;j<cols;j++)//列数
41             {
42                 int idx=j*rows+i;
43                 if(idx<n)
44                 print(filenames[idx],j==cols-1 ? M : M+2,‘ ‘);
45             }
46             printf("\n");
47         }
48     }
49 }

时间: 2024-10-26 18:00:28

UVa 400 Unix Is的相关文章

UVA 400 - Unix ls (Unixls命令)

csdn : https://blog.csdn.net/su_cicada/article/details/86773007 例题5-8 Unixls命令(Unix ls,UVa400) 输入正整数n以及n个文件名,按照字典序排序后按列优先的方式左对齐输出. 假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符. Sample Input 10 tiny 2short4me very_long_file_name shorter size-1 size2 size3 much_lon

UVA 400 Unix ls by sixleaves

题目其实很简单,答题意思就是从管道读取一组文件名,并且按照字典序排列,但是输入的时候按列先输出,再输出行.而且每一行最多60个字符.而每个文件名所占的宽度为最大文件名的长度加2,除了输出在最右边的文件名的宽度是最大文件名长度之外.编程实现这个功能,这就是Unix系统下ls命令的一部分而已.具体实现如下.主要学习的技能要点就是如何用偏移位移法来按列输出.如果一个矩阵n行m列,要按照列输出.但是我们知道,编程时候,只能是for(行)在列.所以必须要有一个偏移量来计算这种偏移关系.x = rows *

Unix ls UVA 400

说说:这道题在开始的时候理解有偏差.其实这道题把unix里的ls命令简化了,这道题的输出格式其实是输出若干列的文件名,且每列占据的字符数是最长的文件名的长度加二,当然最后一列除外,最后一列就是最长的文件名的长度.其实只要将行数从一开始不断的测试,直到输出每行的字符数不超过六十即可.但是我开始理解成要求输出的行数最少,且每列的长度为该列中的最长的文件名的长度加二.这样的话就变得复杂了许多.因为你在计算最少的行数的时候就要统计此种情况下的每列的最长字符数,从而判断每行总的字符数是否会超过六十.原本打

【UVa 400】Unix ls

 Unix ls  The computer company you work for is introducing a brand new computer line and is developing a new Unix-like operating system to be introduced along with the new computer. Your assignment is to write the formatter for the ls function. Your

UVa 400 (水题) Unix ls

题意: 有n个文件名,排序后按列优先左对齐输出.设最长的文件名的长度为M,则最后一列长度为M,其他列长度为M+2. 分析: 这道题很简单,但要把代码写的精炼,还是要好好考虑一下的.lrj的代码中有两个亮点,一个是print子函数,一个就是行数的计算.用心体会 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespac

UVa 400 模拟vector

背景:多久没有一次ac过了,要提升一次ac的几率啊!这对比赛是很重要的. 思路:这个题主要是更加熟悉了下vector,然后就是一些格式的问题,构造即可.主要感受还是一定要把思路想好再写题! #include <set> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <cstring> #include <cstdlib

小白书练习题5.5.3 排序检索类、

UVA 340 Master-Mind Hints 题意:猜数字游戏,给n个数的序列给你.接下来一行是答案序列.剩下的都是猜测序列.对于每一个猜测序列,统计有多少个数字相同并且位置相同.有多少数字相同位置不同.每一个数字只能用一次. 思路:直接统计可以求出数字相同并且位置相同的哪一些数.在此过程中我加了一个标记数组.标记那些用过的数的位置为1,没用过为0:然后枚举猜测中哪些没用过的数字.去答案序列中找.当数字相等并且答案行中那个数也没用过时.计数加1: 1 #include<cstdio> 2

UVa400.Unix ls

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=341 14438645 400 Unix ls Accepted C++ 0.048 2014-10-28 16:11:17 14438408 400 Unix ls Wrong answer C++ 0.048 2014-10-28 15:41:50 14438381 400 Un

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes