CodeForces - 794C C. Naming Company (贪心)

版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/81981244

原题地址:http://codeforces.com/contest/794/problem/C

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

思路:考虑这样的贪心策略,因为两个人都是同样足够聪明的,所以下面策略是正确的

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

举个例子:

甲: x y z

乙: a b c

正解: x c y

#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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81981244