codeforces C. Naming Company 贪心+博弈

来源:互联网 发布:java中注解有几种 编辑:程序博客网 时间:2024/05/22 12:31

C. Naming Company
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Oleg the client and Igor the analyst are good friends. However, sometimes they argue over little things. Recently, they started a new company, but they are having trouble finding a name for the company.

To settle this problem, they've decided to play a game. The company name will consist ofn letters. Oleg and Igor each have a set ofn letters (which might contain multiple copies of the same letter, the sets can be different). Initially, the company name is denoted byn question marks. Oleg and Igor takes turns to play the game, Oleg moves first. In each turn, a player can choose one of the lettersc in his set and replace any of the question marks withc. Then, a copy of the letter c is removed from his set. The game ends when all the question marks has been replaced by some letter.

For example, suppose Oleg has the set of letters {i, o, i} and Igor has the set of letters{i, m, o}. One possible game is as follows :

Initially, the company name is ???.

Oleg replaces the second question mark with 'i'. The company name becomes?i?. The set of letters Oleg have now is {i, o}.

Igor replaces the third question mark with 'o'. The company name becomes?io. The set of letters Igor have now is {i, m}.

Finally, Oleg replaces the first question mark with 'o'. The company name becomes oio. The set of letters Oleg have now is{i}.

In the end, the company name is oio.

Oleg wants the company name to be as lexicographically small as possible while Igor wants the company name to be as lexicographically large as possible. What will be the company name if Oleg and Igor always play optimally?

A string s = s1s2...sm is called lexicographically smaller than a stringt = t1t2...tm (wheres ≠ t) if si < ti wherei is the smallest index such that si ≠ ti. (sosj = tj for allj < i)

Input

The first line of input contains a string s of lengthn (1 ≤ n ≤ 3·105). All characters of the string are lowercase English letters. This string denotes the set of letters Oleg has initially.

The second line of input contains a string t of lengthn. All characters of the string are lowercase English letters. This string denotes the set of letters Igor has initially.

Output

The output should contain a string of n lowercase English letters, denoting the company name if Oleg and Igor plays optimally.

Examples
Input
tinkoffzscoder
Output
fzfsirk
Input
xxxxxxxxxxxx
Output
xxxxxx
Input
ioiimo
Output
ioi
Note

One way to play optimally in the first sample is as follows :

  • Initially, the company name is ???????.
  • Oleg replaces the first question mark with 'f'. The company name becomesf??????.
  • Igor replaces the second question mark with 'z'. The company name becomesfz?????.
  • Oleg replaces the third question mark with 'f'. The company name becomesfzf????.
  • Igor replaces the fourth question mark with 's'. The company name becomesfzfs???.
  • Oleg replaces the fifth question mark with 'i'. The company name becomesfzfsi??.
  • Igor replaces the sixth question mark with 'r'. The company name becomesfzfsir?.
  • Oleg replaces the seventh question mark with 'k'. The company name becomes fzfsirk.

For the second sample, no matter how they play, the company name will always bexxxxxx.



题意:

A有一个字符集合,B也有一个字符集合,数量都一样

组合成一个新的字符串,A想要升序,B想要降序,A先手放字符

并且A要字典序最小,B要字典序最大(意思是A中取最小的(n+1)/ 2个字符,B中取最大的n/2个字符)

题解:

一看就是贪心,所以先排序,A升序,B降序

然后博弈:

注意样例:

x y z

cba

输出:x c y



#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 300005char a[MAXN];char b[MAXN];char ans[MAXN];int cmp1(const void *x,const void *y){    return *(char *)x -*(char *)y;}int cmp2(const void *x,const void *y){    return *(char *)y -*(char *)x;}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%s%s",a,b)!=EOF)    {        int len=strlen(a);        ans[len]='\0';        qsort(a,len,sizeof(a[0]),cmp1);        qsort(b,len,sizeof(b[0]),cmp2);        int left=0,right=len-1;        int ap1=0,ap2=(len+1)/2-1;        int bp1=0,bp2=len/2-1;        while(len--)        {            if(a[ap1]<b[bp1])                ans[left++]=a[ap1++];            else                ans[right--]=a[ap2--];            if(len){                if(a[ap1]<b[bp1])                    ans[left++]=b[bp1++];                else                    ans[right--]=b[bp2--];                len--;            }        }        puts(ans);    }    return 0;}


原创粉丝点击