【贪心+博弈】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 }