比赛的时候。。先yy了一发题目。然后wa了一发之后想清楚了应该怎么搞。。然后就玩了一个半钟,代码敲搓。
(主要当时竟然想到直接计数。。计数这个是个巨坑,千万不能计数啊!!!)题目:http://codeforces.com/problemset/problem/794/C
题目大意:
有两个人想要开公司,两个人手上有相同长度为n的字符串集合,他们需要给公司搞一个名字。
公司名为长度为n的字符串,每次A玩家先从自己集合里挑一个放字符放里面,B玩家再从自己的集合里挑一个字符放里面,直到公司名完成为止。A玩家想要公司名字典序尽量小
B玩家想要公司名字典序尽量大
A和B分别知道对方的集合里还剩下什么字符。
现在在两个人足够聪明的情况下,请问会产生出怎样的公司名。思路:
比赛的时候思路一直是对的。。只是代码搞搓了。。orz
对于A和B:
当A集合中存在比B集合的字符要小的字符的时候,
A肯定想尽量的把小的字符放到最前面,B肯定想尽量把大的字符放到最前面。当A集合中存在比B集合的字符要大或等于的时候,
A肯定想尽量把还需要放的字符中最大的放到最后面,
B肯定想尽量把还需要放的字符中最小的放到最后面,就是一道贪心题。直接模拟一下字符串放置就好了。。
/*
@resources: codeforces
@date: 2017-5-13
@author: QuanQqqqq
@algorithm:
*/
#include <bits/stdc++.h>
#define ll long long
#define eps 1e-6
using namespace std;
char str1[400005],str2[400005],str3[400005];
int main(){
gets(str1);
gets(str2);
int len = strlen(str1);
sort(str1,str1 + len);
sort(str2,str2 + len);
int t1 = 0,t2 = len - 1,idx = len - 1;
bool flag = true,change = false;
for(int i = 0;i < len;i++){
if(str1[t1] >= str2[t2] && !change){
change = true;
int tlen = len - i;
int tmp1 = i % 2 ? tlen / 2 : (int)ceil(tlen / 2.0);
int tmp2 = i % 2 ? (int)ceil(tlen / 2.0) : tlen / 2;
tmp1--,tmp2--;
while(tmp1--){
t1++;
}
while(tmp2--){
t2--;
}
}
if(flag){
if(change){
str3[idx--] = str1[t1];
t1--;
} else {
str3[i] = str1[t1];
t1++;
}
} else {
if(change){
str3[idx--] = str2[t2];
t2++;
} else {
str3[i] = str2[t2];
t2--;
}
}
flag = !flag;
}
str3[len] = '\0';
printf("%s\n",str3);
}