題目的意思還是很容易理解的,代碼也很容易些,但是細節很多,如果屢不清就會錯了也不知道在哪錯的。
我開始的想法就是,對於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;
}