题意:
x,y两人轮流从各自的字符串a,b(长度都为n)里选择字符,形象的来说就是往一个长度为n里的容器里放所选择的字符,x先手,x想最后的字典序越小越好,y想最后的字典序越大越好,问他们两都采取最优的策略,问最后获得的字符串是什么
解题思路:
首先我们容易想到,x只能取出前n/2小的字符来投放,并且,最后字符的位置一定是字典序递增的,因为想最后的字典序最小,而y是只能取出前n/2大的字符,并且是最后字符的位置一定是字典序递剑的。
然后就是投放位置的问题。
当轮到x放的时候,假如当前字典序最小的字符都大于等于(等于非常重要)b的字典序最大的字符串了,那么就应该让b的字符越往前放越好,所以应该要让自己字典序最大(因为对于x来说,一定按字典序递增)的字符先放在最后一个位置上。
y的话正好相反
为什么等于也要这样放呢?赛时没过就是因为我没有加等于QAQ
因为a字符串当前字符之后的字符可能大于b里所有的字符,
比如
a:abc
b:aaa
如果不加等于号得到的就是aba 顺序为a--,a-a,aba
加了等于号就是aab 顺序为--b,-ab,aab
对于x来说明显第二种最优。
所以等于号一定要加。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
char a[maxn];
char b[maxn];
char c[maxn];
bool cmp(char x, char y)
{
return x>y;
}
int main()
{
scanf("%s%s", a, b);
int i, j, n=strlen(a);
sort(a, a+n);
sort(b, b+n, cmp);
// printf("%s\n", b);
i=j=0;
int k=0, l=0, r=n-1, ir=(n-1)/2, jr=(n-1)/2;
if(n%2)jr--;
while(k<n)
{
if(k%2==0)
{
if(a[i]>=b[j])
{
c[r--]=a[ir--];
}
else
{
c[l++]=a[i++];
}
}
else
{
if(b[j]<=a[i])
{
c[r--]=b[jr--];
}
else c[l++]=b[j++];
}
k++;
}
printf("%s\n", c);
// j=0, k=0;
// for(i=0; i<n; i++)
// {
// if(i%2==0)printf("%c", a[j++]);
// else printf("%c", b[k++]);
// }
return 0;
}