Codeforces 794C. Naming Company

C. Naming Company
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard 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 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 = s1s2…sm is called lexicographically smaller than a string t = t1t2…tm (where s ≠ t) if si < ti where i is the smallest index such that si ≠ ti. (so sj = tj for all j < i)
Input
The first line of input contains a string s of length n (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 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.

這道題有點兒坑,就是一個運用博弈論思想字符串排序的題。坑點在於當第一個字符串的最小值都比第二個字符串的最大值都大,因此需要將必須選的字符串(每個字符串選擇一半即可)的最壞情況放在最後的位置。我用了6個僞指針來指向頭尾位置,據說某大佬用vector輕輕鬆鬆就過了。。。還是自己太渣

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
char a[300005];
char b[300005];
char c[300005];
char cmp(char a, char b){
     return a > b;
}
int main(){
     cin>>a>>b;
     int n = strlen(a);
     sort(a, a + n);
     sort(b, b + n, cmp);
     int l = (n + 1) / 2;    
 // l取長度的一半,即爲每個字符串要選擇的長度
     int k = 0, p = n - 1;
     int x = l - 1, y = l - 1;
     int  i = 0, j = 0;
     //k指向c字符串的頭,p指向c字符串的尾
     //i指向a字符串的頭,x指向a字符串的尾
     //j指向b字符串的頭,y指向b字符串的尾
     if(n%2 == 1) y--;   // 坑點,如果n爲奇數,b要選的長度減1
     while(k <= p){
          if(a[i] < b[j])
               c[k++] = a[i++];
          else           //最壞情況
               c[p--] = a[x--];
          if(k > p)
               break;
          if(b[j] > a[i])
               c[k++] = b[j++];
          else           //最壞情況
               c[p--] = b[y--];
     }
     for(int i = 0; i < n; i++)
          cout<<c[i];
     cout<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章