codeforces 794C Naming Company(贪心)

106 篇文章 0 订阅
51 篇文章 0 订阅

题意:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值