题目链接:http://codeforces.com/contest/794/problem/C
题意:有两个人每个人都有一个长度为n的字符串,两人轮流拿出一个字符串,放在一个长度为n的字符串的指定位置中,第一个
人他想让最后组成的字符串尽可能小,另一个人想要字符串尽可能的大。他们互相知道各自手中有什么字符串,最后输出组成的
字符串
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <deque> using namespace std; const int M = 3e5 + 10; char s1[M] , s2[M] , s[M]; deque<char>Ol , Ig; bool cmp(char x , char y) {return x > y;} int main() { cin >> s1 >> s2; int n = strlen(s1); sort(s1 , s1 + n) , sort(s2 , s2 + n , cmp); if(n % 2 == 0) { for(int i = 0 ; i < n / 2 ; i++) { Ol.push_back(s1[i]); } for(int i = 0 ; i < n / 2 ; i++) { Ig.push_back(s2[i]); } } else { for(int i = 0 ; i <= n / 2 ; i++) { Ol.push_back(s1[i]); } for(int i = 0 ; i < n / 2 ; i++) { Ig.push_back(s2[i]); } } int sta = 0 , end = n - 1; while(!Ol.empty()) { if(Ig.empty()) { s[sta++] = Ol.front(); break; } char cp1 = Ol.front() , cp2 = Ig.front(); int flag = 0; if(cp1 < cp2) { s[sta++] = cp1; flag = 1; } else { s[end--] = Ol.back(); flag = 2; } if(flag == 1) { Ol.pop_front(); } else { Ol.pop_back(); } if(Ol.empty()) { s[sta++] = cp2; break; } else { flag = 0; char cp3 = Ol.front(); if(cp2 > cp3) { s[sta++] = cp2; flag = 1; } else { s[end--] = Ig.back(); flag = 2; } if(flag == 1) { Ig.pop_front(); } else { Ig.pop_back(); } } } cout << s << endl; return 0; }