【贪心+博弈】C. Naming Company

http://codeforces.com/contest/794/problem/C

题意:A,B两人各有长度为n的字符串,轮流向空字符串C中放字母,A尽可能让字符串字典序小,B尽可能让字符串字典序大,A,B都知道对方的情况;A先手。

首先,A要C的字典序大,B要C的字典序小,所以先贪心,A的按从小到大排序,B的按从大到小排序。

那么现在我们已经知道了A,B分别要选择放到C的字符。

接下来博弈:

B的最大字符等于小于A的最小字符:

  • A走:A一定要B放到前面,所以A尽可能放到后面,放哪个呢?当然是大字符;
  • B走:B一定要A放在前面,所以B尽可能放在后面,放哪个呢?当然是小字符;

B的最大字符大于A的最小字符:

  • A走:A一定要把自己的小字符先放在前面;
  • B走:B一定要把自己的大字符先放在前面;
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<set>
 8 #include<map> 
 9 #include<utility> 
10 using namespace std;
11 const int maxn=3e5+5;
12 char a[maxn];
13 char b[maxn];
14 char c[maxn];
15 char aa[maxn];
16 char bb[maxn];
17 bool cmp(char x,char y)
18 {
19     return y>x;
20 }
21 int main()
22 {
23     scanf("%s",a);
24     scanf("%s",b,cmp);
25     int l=strlen(a);
26     sort(a,a+l);
27     sort(b,b+l);
28     memset(aa,'\0',sizeof(aa));
29     memset(bb,'\0',sizeof(bb));
30     memset(c,'\0',sizeof(c));
31     int la,lb;
32     if(l%2==0)
33     {
34         la=l/2;
35     }
36     else
37     {
38         la=l/2+1; 
39     }
40     lb=l/2;
41 
42     for(int i=0;i<la;i++)
43     {
44         aa[i]=a[i];
45     }
46     int cnt=0;
47     for(int i=l-1;i>=l-lb;i--)
48     {
49         bb[cnt++]=b[i];
50     }
51     int pa,qa,pb,qb,pc,qc;
52     pa=0;
53     qa=la-1;
54     pb=0;
55     qb=lb-1;
56     pc=0;
57     qc=la+lb-1;
58     cnt=0;
59     while(1)
60     {
61         if(cnt==la+lb)
62         {
63             break;
64         }
65         if(cnt%2==0)
66         {
67             if(bb[pb]<=aa[pa])
68             {
69                 c[qc--]=aa[qa--];
70             }
71             else
72             {
73                 c[pc++]=aa[pa++];
74             }
75         }
76         else
77         {
78             if(bb[pb]<=aa[pa])
79             {
80                 c[qc--]=bb[qb--];
81             }
82             else
83             {
84                 c[pc++]=bb[pb++];
85             }
86         }
87         cnt++;
88      } 
89     
90     cout<<c<<endl;
91     return 0;
92 }
View Code

 

转载于:https://www.cnblogs.com/itcsl/p/6879344.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值