codeforces 794C Naming Company(贪心)

来源:互联网 发布:网络客服沟通技巧 编辑:程序博客网 时间:2024/06/15 20:49

题意:

x,y两人轮流从各自的字符串a,b(长度都为n)里选择字符,形象的来说就是往一个长度为n里的容器里放所选择的字符,x先手,x想最后的字典序越小越好,y想最后的字典序越大越好,问他们两都采取最优的策略,问最后获得的字符串是什么


解题思路:

首先我们容易想到,x只能取出前n/2小的字符来投放,并且,最后字符的位置一定是字典序递增的,因为想最后的字典序最小,而y是只能取出前n/2大的字符,并且是最后字符的位置一定是字典序递剑的。

然后就是投放位置的问题。

当轮到x放的时候,假如当前字典序最小的字符都大于等于(等于非常重要)b的字典序最大的字符串了,那么就应该让b的字符越往前放越好,所以应该要让自己字典序最大(因为对于x来说,一定按字典序递增)的字符先放在最后一个位置上。

y的话正好相反


为什么等于也要这样放呢?赛时没过就是因为我没有加等于QAQ

因为a字符串当前字符之后的字符可能大于b里所有的字符,

比如

a:abc

b:aaa

如果不加等于号得到的就是aba    顺序为a--,a-a,aba

加了等于号就是aab 顺序为--b,-ab,aab

对于x来说明显第二种最优。

所以等于号一定要加。


代码:

#include <bits/stdc++.h>using namespace std;const int maxn=3e5+5;char a[maxn];char b[maxn];char c[maxn];bool cmp(char x, char y){    return x>y;}int main(){    scanf("%s%s", a, b);    int i, j, n=strlen(a);    sort(a, a+n);    sort(b, b+n, cmp);//    printf("%s\n", b);    i=j=0;    int k=0, l=0, r=n-1, ir=(n-1)/2, jr=(n-1)/2;    if(n%2)jr--;    while(k<n)    {        if(k%2==0)        {        if(a[i]>=b[j])        {            c[r--]=a[ir--];        }        else        {            c[l++]=a[i++];        }        }        else        {            if(b[j]<=a[i])            {                c[r--]=b[jr--];            }            else c[l++]=b[j++];        }        k++;    }    printf("%s\n", c);//    j=0, k=0;//    for(i=0; i<n; i++)//    {//        if(i%2==0)printf("%c", a[j++]);//        else printf("%c", b[k++]);//    }    return 0;}


原创粉丝点击