codeforces 794C C. Naming Company

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_stage/article/details/77899186

http://codeforces.com/contest/794/problem/C

题意: Oleg 和 Igor 比赛,每个人都有一串相同长度的字符串,他俩想组成一个跟自己的字符串长度相等的串,O想这个串字典序最小,Ig想串字典序最大,每人每次把自己串中的一个字符添加进答案串中,且每个位置的串只能添加一次。问你最后结果。

思路:
先把Oleg的串按小->大排序,之后Igor的串由大->小排序
之后贪心吧,要小心的是Oleg的串的小的字符比Igor大的字符还要大;
我们设定sl为s串左小标,sr为右下标,因为2个串各取一半,所以排序后只要一半就可以。tl,tr同理,al,ar为答案串的左和右之后判断下就可以了。

#include <bits/stdc++.h>
#define maxs 202002
#define mme(i,j) memset(i,j,sizeof(i))
#define ll long long
using namespace std;
char s[300005],t[300005],ans[300005];

bool cmp(char x,char y){
    return x>y;
}

int main()
{
    while(~scanf("%s%s",s,t))
    {
        int len=strlen(s);
        sort(s,s+len);
        sort(t,t+len,cmp);
        int al=0,ar=len-1,sl=0,sr=(len-1)/2,tl=0,tr=(len-1)/2,pos=0;
        if(len%2)
            tr--;
        while(pos<len){
            if(pos%2==0){
                if(s[sl]>=t[tl]){
                    ans[ar--]=s[sr--];
                }else
                    ans[al++]=s[sl++];
            }else{
                if(t[tl]<=s[sl]){
                    ans[ar--]=t[tr--];
                }else
                    ans[al++]=t[tl++];
            }
            pos++;
        }
        ans[len]='\0';
        printf("%s\n",ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/My_stage/article/details/77899186
今日推荐