题目的意思还是很容易理解的,代码也很容易些,但是细节很多,如果屡不清就会错了也不知道在哪错的。
我开始的想法就是,对于n的字符串,如果第i个字母都相同就直接输出,如果不同就输出排序后的第n/2-1串的第i个字符。
这么写仅仅几个样例能过。
正确的算法是。
将n个字符串排序,直接使用sort即可。然后a为第n/2个字符串,b为第n/2+1个,那么要输出的字符串就介于a,b之间。
对于第i个字符
if(a[i]==b[i]) print(a[i])
否则的话,
if(i==a.length()-1) print(a[i]);
else if(b[i]-a[i]>1 || i!=b.length()) print(a[i]+1) break;
else //否则的话说明b字符串已经到头了,还剩下从i+1开始的字符串
print(a[i])
if(a[i]==Z || i==a.length()-1) print(a[i])
else print(a[i]+1) break
详解见代码
#include<bits/stdc++.h>
using namespace std;
string st[1005];
vector<int>a;
int main()
{
int n;
while(cin>>n && n){
getchar(); //需要把n过滤掉
for(int i=0;i<n;i++) {
getline(cin,st[i]);
}
sort(st,st+n); //排序
string a=st[n/2-1];
string b=st[n/2];
for(int i=0;i<a.length()&&i<b.length();i++){
if(a[i]==b[i]) printf("%c",a[i]); //如果相等直接输出
else{
if(i==a.length()-1){ //如果到达a最后一个字符,直接输出(且说明了b比a长)
printf("%c",a[i]);
}
else if(b[i]-a[i]>1 || i!=b.length()-1){ //如果b[i]比a[i]大两个字符及以上或者没到b的最后,直接输出a[i]+1
printf("%c",a[i]+1);
break;
}
else{ //如果b已经到头了,并且b[i]-a[i]==1; 那么需要看剩下的a
printf("%c",a[i]); //先把a[i]输出了
for(int j=i+1;j<a.length();j++){
if(a[j]=='Z' || j==a.length()-1) printf("%c",a[j]); //如果是z的话需要特判一下(前面不可能出现z的情况,因为b[i]>a[i]
else{
printf("%c",a[j]+1); //直接输出a[i]+1,break即可
break;
}
}
break;
}
}
}
printf("\n");
}
return 0;
}