这题就是给字符串排序,然后按照题目的要求的个数输出。。
难点就是在这个格式,要求是一行只能60个字符,要行数最少,所以必须用 62 除以 最长的那个字符串长度加2 判断有几列,然后注意一下细节输出。。
不知道为什UVA上能过,但拿到ZOJ的时候PE何时错误了。。
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
#include<string.h>
using namespace std;
int cmp(const void *p1 ,const void *p2) {
return *((string*)p1) > *((string*)p2);
}
int main () {
int t, max = 0;
int row;
int line;
string name[1100];
while ( scanf("%d\n" ,&t) != EOF ) {
for (int i = 0 ; i < t ;i++ ) {
getline (cin ,name[i]);
}
qsort (name , t ,sizeof(name[0]),cmp);
for (int j = 0; j < 60 ;j++)
cout << "-";
cout << endl;
for (int k = 0;k < t ;k++) {
if(name[k].size() > max)
max = name[k].size();
}
row =(int) (62/(max + 2));
if (t % row == 0)
line = t / row;
else
line =(int) (t / row) +1;
for (int i = 0; i < line ; i++){
for (int j = 0 ; j < row ;j++) {
if ( j * line < t)
cout << name[i + (j * line)];
if (j == row -1 || (i + (j * line)) + line == t )
break;
for (int k = name[i + (j * line)].size(); k < max + 2 ;k++)
cout <<" ";
}
cout << endl;
}
for ( int k = 0 ;k < 110 ;k++) {
name[k] = "";
}
max = 0;
row = 0;
line = 0;
}
return 0;
}