UVA - 400 Unix ls qsort的用法

来源:互联网 发布:九品网络电视安卓版 编辑:程序博客网 时间:2024/05/08 21:13

题目大意:给出N个文件名,要求你按升序排序输出,按列升序,所每行最多只能输出60个字符,每个文件名的宽度为最长文件名的长度+2(除了最长的文件名以外)

解题思路:因为每个文件名的宽度都为最长的文件名加2,因为最长的文件名的长度比其他的宽度少了2,所以每行的最多输出有62,所以每行最多能有C = 62/(max_len + 2)个单词,现在要求有多少行,当每行都能满的情况,就有R = N / C,不满的情况R = N / C + 1,总结起来R = (N-1) / C + 1

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 70#define maxm 110char str[maxm][maxn];int N;int cmp(const void *p1,const void *p2) {return strcmp((char *) p1,(char *)p2);}int main() {char temp[100];int cnt = 0;int max_len;while(gets(temp)) {sscanf(temp,"%d",&N);max_len = 0;for(; cnt < N; cnt++) {gets(str[cnt]);int temp = strlen(str[cnt]);max_len = max(temp,max_len);}qsort(str,N,sizeof(str[0]),cmp);printf("------------------------------------------------------------\n");int C = 62 / (max_len+2);int R = (N - 1) / C + 1;for(int i = 0; i < R; i++) {for(int j = 0; j < C; j++) {if(j * R + i >= N)break;elseprintf("%s",str[j * R + i]);int len = max_len - strlen(str[ j * R + i]);for(int k = 0; k < len; k++)printf(" ");if(j != C - 1)printf("  ");}printf("\n");}cnt = 0;}return 0;}




0 0