题目概要:输入一个n(2<=n<=1000&&n为偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中一半的字符串小于等于S,另一半大于S。
如果有多解,输出字典序最小的解。
一道注重细节的搜索题。
先排序,然后取中间两个进行处理。
WA了很多次,看了网上的题解,但是觉得题解if那么多情况,那是得多仔细才能搞出来。于是我宁愿牺牲一点效率也要把处理的难度降下来,用最简单的暴搜,逐个遍历26个字母,挑出第一个满足的即可。这里的搜索是深搜,采用的是直接迭代。
废话不多说,直接上代码:
#include<stdio.h>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
string solve(const string& str1, const string& str2)
{
int minsize = str1.size() < str2.size() ? str1.size() : str2.size();
for (int i = 0;i != minsize;++i)
{
if (str1[i] != str2[i])
{
int index = i;
string ret = str1.substr(0, i);
for (char k = str1[index];k <= 'Z';++k)
{
string temp = ret;
temp += k;
if (temp >= str1&&temp < str2)
return temp;
if (k == 'Z')
{
ret += str1[index];
k = 'A' - 1;
if (++index == str1.size())
break;
}
}
}
}
return str1;
}
int main()
{
int n;
while (cin >> n && n)
{
vector<string> w;
int cnt = n;
while (cnt--)
{
string str;
cin >> str;
w.push_back(str);
}
sort(w.begin(), w.end());
cout << solve(w[(n / 2) - 1], w[n / 2]) << "\n";
}
return 0;
}
很多人错都不知道错在哪,下面我给几个测试用例,这几个加上UVA给的能过的话,应该可以AC
input
2
AZZZCCC
B
2
AZZ
B
2
FIRD
FIREDIE
2
JEOAAA
JERAAS
0
OUTPUT
AZZZD
AZZ
FIRD
JEP