UVA 1610 Party Games 模拟 有细节

题目大意是给出两个字符串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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值