版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}