zoukankan      html  css  js  c++  java
  • 【贪心+博弈】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,'',sizeof(aa));
    29     memset(bb,'',sizeof(bb));
    30     memset(c,'',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
  • 相关阅读:
    sql -- 获取商品分类的最新销售情况
    sql -- 获取连续签到的用户列表
    sql -- 利用order by 排名作弊
    sql -- update表子查询、多条件判断case when
    sql-- 找到重复数据并删除、有重复数据不插入或更新的处理方法
    sql--自链接(推荐人)
    sql--测试商品的重要度,是否需要及时补货
    sql面试题
    TCP/IP 3次握手
    REST和SOAP
  • 原文地址:https://www.cnblogs.com/itcsl/p/6879344.html
Copyright © 2011-2022 走看看