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

Description

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 of n letters. Oleg and Igor each have a set of n letters (which might contain multiple copies of the same letter, the sets can be different). Initially, the company name is denoted by n question marks. Oleg and Igor takes turns to play the game, Oleg moves first. In each turn, a player can choose one of the letters c in his set and replace any of the question marks with c. 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 = s_1s_2...s_m$ is called lexicographically smaller than a string $t = t_1t_2...t_m$ (where $s ≠ t$) if $si < ti$ where $i$ is the smallest index such that $s_i ≠ t_i$. (so $s_j = t_j$ for all $j < i$)

Input

The first line of input contains a string $s$ of length $n$ ($1 ≤ n ≤ 3·10^5$). 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 length $n$. 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
tinkoff
zscoder output
fzfsirk input
xxxxxx
xxxxxx output
xxxxxx input
ioi
imo 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 becomes f??????.

Igor replaces the second question mark with 'z'. The company name becomes fz?????.

Oleg replaces the third question mark with 'f'. The company name becomes fzf????.

Igor replaces the fourth question mark with 's'. The company name becomes fzfs???.

Oleg replaces the fifth question mark with 'i'. The company name becomes fzfsi??.

Igor replaces the sixth question mark with 'r'. The company name becomes fzfsir?.

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 be xxxxxx.

Announcement

Problem C. Naming Company

$*****$

The two players know the letters in both sets.

Key

题意:甲乙两人各持有一个长度均为n的字符串,轮着向一个新的长也为n的字符串里放字符,甲先行。甲每一步都试图让字符串按字典序最小化,乙每一步都试图让字符串按字典序最大化。问最后这新字符串是什么。

思路:做题做到一半时出题人推送了一个Announcement(如上面所示):甲乙均知道对面的情况。这是个很重要的提示。

显然的是,先排个序,甲从小到大,乙从大到小。然后两个字符串的后一半肯定是用不上了,砍掉。最后甲字符串长度$(len + 1) / 2$,乙字符串长度$(len) / 2$。

甲乙试图让自己走的每一步最优,那就是贪心无误了。

1.当$甲最小的字符<乙最大的字符$时,两者均靠左放置最小/大字符。

2.当$甲最小的字符>=乙最大的字符$时,两者均靠右放置最大/小字符。

如何找当前最优情况想了很久,一开始想的情况很复杂,如何换个角度思考问题很不容易啊。要注意的是第2种情况的等于号,一开始我放在第1种情况上了(“<=”),这是不对的,找了好久最后才发现竟然错在了一个小小的等于号。“=”号一删,瞬间AC。

Code

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 3e5 + 10;
char s1[maxn], s2[maxn], ans[maxn];
int len; bool cmp1(const char &a, const char &b) {
return a < b;
}
bool cmp2(const char &a, const char &b) {
return a > b;
} int main()
{
ios::sync_with_stdio(false);
cin >> s1 >> s2;
len = strlen(s1);
sort(s1, s1 + len, cmp1);
sort(s2, s2 + len, cmp2); int i = 0;
char *pl[2] = { s1, s2 };
for (; (i < len) && (*pl[0] < *pl[1]); ++i) {
ans[i] = *(pl[i & 1]++);
} int j = len - 1;
char *pr[2] = { s1 + (len + 1) / 2 - 1, s2 + (len) / 2 - 1 };
for (; i < len; ++i, --j) {
ans[j] = *(pr[i & 1]--);
} ans[len] = '\0';
cout << ans;
return 0;
}

[刷题]Codeforces 794C - Naming Company的更多相关文章

  1. CodeForces - 794C:Naming Company(博弈&简单贪心)

    Oleg the client and Igor the analyst are good friends. However, sometimes they argue over little thi ...

  2. [刷题codeforces]650A.637A

    650A Watchmen 637A Voting for Photos 点击查看原题 650A又是一个排序去重的问题,一定要注意数据范围用long long ,而且在写计算组合函数的时候注意也要用l ...

  3. [刷题codeforces]651B/651A

    651B Beautiful Paintings 651A Joysticks 点击可查看原题 651B是一个排序题,只不过多了一步去重然后记录个数.每次筛一层,直到全为0.从这个题里学到一个正确姿势 ...

  4. [刷题]Codeforces 786A - Berzerk

    http://codeforces.com/problemset/problem/786/A Description Rick and Morty are playing their own vers ...

  5. [刷题]Codeforces 746G - New Roads

    Description There are n cities in Berland, each of them has a unique id - an integer from 1 to n, th ...

  6. CF刷题-Codeforces Round #481-G. Petya's Exams

    题目链接:https://codeforces.com/contest/978/problem/G 题目大意:n天m门考试,每门考试给定三个条件,分别为:1.可以开始复习的日期.2.考试日期.3.必须 ...

  7. CF刷题-Codeforces Round #481-F. Mentors

    题目链接:https://codeforces.com/contest/978/problem/F 题目大意: n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值 ...

  8. CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression

    题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...

  9. [刷题]Codeforces 785D - Anton and School - 2

    Description As you probably know, Anton goes to school. One of the school subjects that Anton studie ...

随机推荐

  1. 走入PHP-类与对象

    PHP中用class来定义类,用new实例化对象,用extends继承类,不过只能单继承,属性和方法有public.private和protected做访问控制,默认为public,在类里定义常量不需 ...

  2. iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值

    这篇博客光看标题或许就会产生疑问,某个对象,只要它存在某个属性,且值不是空的,不就能直接用点方法获取吗,为什么要拆分成key和value多此一举呢?下面,我用一个例子告诉大家,既然这方法是存在的,那就 ...

  3. line-height属性总结

     line-height属性的继承性: 子元素不设置line-height时, 在父元上设置带单位的值和百分比时会先计算父元素的line-height大小然后继承过来,在父元素上设置无单位的数值时,子 ...

  4. 【转】FLEX中SharedObject介绍及应用

    ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...

  5. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  6. BroadcastReceiver简单应用实例

    BroadcastReceiver是android四大组件之一,主要用于接收广播,它的简单实现方法如下: 1.定义继承BroadcastReceiver的MyReceiver类: /** * Crea ...

  7. python 实例方法,类方法和静态方法

    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法, ...

  8. Webdriver API之操作(一)

    一. 控制浏览器 1. 控制浏览器大小 driver.set_window_size(480,800) #浏览器宽480,高800显示 dirver.maximize_window() #浏览器最大化 ...

  9. Jquery一些实用函数

    1.jQuery.parseJSON( json )第一个参数json的类型是字符串: var obj = jQuery.parseJSON( '{ "name": "J ...

  10. 【Linux配置】vim配置文件内容

    vim的配置 文件:~/.vimrc 在自己的家目录中的.vimrc文件进行编辑配置 设置如下: set nu "序号 set tabstop= "tab键的大小 set show ...