版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/81981244
原题地址:http://codeforces.com/contest/794/problem/C
题意:甲乙两人各持有一个长度均为n的字符串,轮着向一个新的长也为n的字符串里放字符,甲先行。甲每一步都试图让字符串按字典序最小化,乙每一步都试图让字符串按字典序最大化。问最后这新字符串是什么。
思路:考虑这样的贪心策略,因为两个人都是同样足够聪明的,所以下面策略是正确的
1.当甲最小的字符
乙最大的字符时,两者均靠左放置最小/大字符。
2.当甲最小的字符
乙最大的字符时,两者均靠右放置最大/小字符。
举个例子:
甲:
乙:
正解:
#include <bits/stdc++.h>
#include <cmath>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 3e5 + 5;
const int mod = 998244353;
char a[maxn], b[maxn];
bool cmp(char a, char b) {
return a > b;
}
char c[maxn];
int main() {
scanf("%s%s", a + 1, b + 1);
int len = strlen(a + 1);
sort(a + 1, a + len + 1);
sort(b + 1, b + len + 1, cmp);
int la = (len + 1) / 2;
int lb = len / 2;
int sa = 1;
int sb = 1;
int flag = 1;
int lenn = len;
for (int i = 1; i <= len; i++) {
if (flag) {
if (a[sa] < b[sb]) {
c[i] = a[sa++];//正着填数字
} else {
c[lenn--] = a[la--];//倒着填数字
}
} else {
if (b[sb] > a[sa]) {
c[i] = b[sb++];
} else {
c[lenn--] = b[lb--];
}
}
flag ^= 1;
}
c[len + 1] = 0;
printf("%s\n", c + 1);
return 0;
}