问题 E: PIPI的字符串游戏

题目描述

输入一个n(2≤n≤1000,n是偶数)个字符串的集合D,找一个长度最短的字符串(不一定在D中出现)S,使得D中恰好一半串小于等于S,另一半串大于S。如果有多解,输出字典序最小的解。例如,对于{JOSEPHINE,JERRY},输出JF;对于{FRED,FREDDIE}输出FRED。字符串全部由大写字母构成。

输入

输入包含多组测试用例。
对于每一组用例,第一行包含一个正整数 n,代表字符串个数。
接下来n行每行输入一个有大写字母构成的字符串(串长不超过10000)。
一个单独的0代表输入结束。

输出

对于每一组样例,输出对应的S串。

样例输入

4
FRED
SAM
JOE
MARGARET
2
FRED
FREDDIE
2
JOSEPHINE
JERRY
2
LARHONDA
LARSEN
0

样例输出

K
FRED
JF
LARI

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=1005;
string str[N];
int main()
{
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>str[i];
        }
        sort(str+1,str+1+n); ///将字符串进行排序
        string l=str[n/2],r=str[n/2+1],ans=""; ///找到中间的两个字符串
        int flag=0,cnt=0; ///cnt记录此时遍历到的l字符串的位置
        while(flag==0)
        {
            for(int i='A';i<='Z';i++) ///第一次先将所有的字母遍历一遍 看看是否存在最小的字母符合要求
            {
                string t=ans;
                t+=i;
                if(t>=l&&t<r) {flag=1;ans=t;break;}
            }
            if(flag) break;
            ans+=l[cnt++]; ///如果不存在单个字母大于等于l小于r的话 说明l和r的第一个字符相等
        }
        cout<<ans<<endl;
    }
    return 0;
}

发布了78 篇原创文章 · 获赞 7 · 访问量 4578

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/104424866