1042: 小丑排序

来源:互联网 发布:格力电器 知乎 编辑:程序博客网 时间:2024/04/27 21:02

1042: 小丑排序

时间限制: 1 Sec  内存限制: 128 MB
提交: 124  解决: 102
[提交][状态][讨论版]

题目描述

你在信天翁马戏团(是的,它是由一群小丑组成)从事管理工作,你刚刚写完一个程序的输出是将他们的姓名按长度为非递减的方式排列,名称列表(使每名至少只要它之前的)。然而,你的老板不喜欢这种输出方式,而是希望输出出现更对称,较短的字符串在顶部和底部,而较长的字符串在中间。他的规则是,每一对名称都是在该列表的相对的两端,并且在该组中的第一个名字总是在列表的顶部。比如在下面的第一个例子中,Bo和Pat是第一对,Jean和Kevin是第二对,等等。

输入

输入由1到多个字符串集合组成,最后一行为0表示输入结束,每个集合开始于一个整数n,表示该集合字符串的个数,接下来n行由n个字符串按长度非递减的方式排列,每个集合至少包含一个但不超过15个字符串,每个字符串不超过25个字符。

输出

对于每个集合,第一行输出"set-n", n从1开始,接下来的若干行对应输入每个集合重新排列的结果,如样例所示。

样例输入

7BoPatJeanKevinClaudeWilliamMarybeth6JimBenZoeJoeyFrederickAnnabelle5JohnBillFranStanCece0

样例输出

set-1BoJeanClaudeMarybethWilliamKevinPatset-2JimZoeFrederickAnnabelleJoeyBenset-3JohnFranCeceStan

Bill

#include<iostream>using namespace std;int main(){int n;int count(1);while(cin>>n&&n!=0){string a[n];for(int i=0;i<n;i++)cin>>a[i];int i=0;cout<<"set-"<<count<<endl;do{cout<<a[i]<<endl;i+=2;}while(i<n);if(n%2==0)for(int j=n-1;j>0;j=j-2)cout<<a[j]<<endl;elsefor(int j=n-2;j>0;j=j-2)cout<<a[j]<<endl;count++;}return 0;}


下面是我师父写的:


#include<iostream>using namespace std;void strcp(char a[],char b[]){    int i;    for(i=0;b[i]!='\0';i++){        a[i]=b[i];    }    a[i]='\0';}int main(){    int cases=0;    int n;    char name_list[15][26];    char out_list[15][26];    char temp[26];    while(cin>>n){        if(n==0)            break;        for(int i=0;i<n;i++){            cin>>name_list[i];        }        int j=0;        for(int i=0;i<n/2;i++){           strcp(out_list[i],name_list[j]);           strcp(out_list[n-1-i],name_list[j+1]);           j+=2;        }        if(n%2!=0)            strcp(out_list[n/2],name_list[j]);        cases++;        cout<<"set-"<<cases<<endl;        for(int i=0;i<n;i++)            cout<<out_list[i]<<endl;    }}

1 0