UVA 1610 Party Games 模拟 有细节

版权声明:也还是请注明一下原地址,虽然写的不是很好。。。 https://blog.csdn.net/Good_night_Sion_/article/details/73730510

题目大意是给出两个字符串S1和S2,找到一个字符串S使得S1<=S &&S<S2,要求S在长度最短的情况下字典序最小

一道简单的模拟题啦,就是细节有点多,也就当做是恢复训练的练手了,毕竟为了期末考试有很久都没有碰过题目了。

我个人是分了许多种情况,然后感觉也写的比较乱糟糟的,这里只把几个坑点说一下吧

1、题目要求的是长度最短!始终记住这是第一优先级,数据是

2

ABCDEFGHIJ

AC

答案应该是ABD

2、要记住,在给某个字符+1的时候要判断一下那个字符是不是Z,数据:

2

ACZZZ

AD

2

ACZZYY

AD

答案应该是

ACZZZ

ACZZZ


总之这道题弄来弄去有点绕,因为是以长度最短为第一优先级,可能有点不适应。。。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxm=1010;

int n;
string arr[maxm],ans;

int main(){
    ios_base::sync_with_stdio(0);
    while(cin>>n&&n){
        for(int i=1;i<=n;++i)cin>>arr[i];
        sort(arr+1,arr+n+1);

        int ind=0,tmp=min(arr[n>>1].size(),arr[(n>>1)+1].size());
        while(ind<tmp&&arr[(n>>1)+1][ind]==arr[n>>1][ind])ans+=arr[n>>1][ind++];
        if(tmp!=ind){
            if(arr[n>>1].size()-ind==1)
                ans+=arr[n>>1][ind];
            else if(arr[(n>>1)+1].size()-ind==1&&arr[(n>>1)+1][ind]-arr[n>>1][ind]>1)
                ans+=(arr[n>>1][ind]+1);
            else if(arr[(n>>1)+1][ind]-arr[n>>1][ind]>1)
                ans+=(arr[n>>1][ind]+1);
            else{
                if(arr[(n>>1)+1].size()-ind==1){
                    ans+=arr[n>>1][ind];
                    if(ind+2==arr[n>>1].size())
                        ans+=arr[n>>1][ind+1];
                    else{
                        ++ind;
                        while(ind<arr[n>>1].size()&&arr[n>>1][ind]=='Z')ans+='Z',++ind;
                        if(ind+1<arr[n>>1].size())
                            ans+=(arr[n>>1][ind]+1);
                        else if(ind!=arr[n>>1].size())
                            ans+=(arr[n>>1][ind]);
                    }
                }else
                    ans+=(arr[n>>1][ind]+1);
            }
        }

        cout<<ans<<endl;
        ans.clear();
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/Good_night_Sion_/article/details/73730510