C. Naming Company(细节,贪心)

? 怎么说呢?这题还是很有迷惑性的

比较容易想到的做法肯定是每次拿a串最小的字母构造字典序最小

每次拿b串最大的字母构造字典序最大

q a , w b 那么假设当前q为a串最小字母,w为b串最大字母

. : q < = w , Ⅰ.构造字典序最小时:q<=w,尽量往左边放

q > w , b , 如果q>w,说明b串后面的字母都很小,那就尽量往右边放置

. : , Ⅱ.构造字典序最大时:和上面思路一样,只是顺序反一下

看起来显然的贪心策略,居然是错的!!!

a a b c , b a a a a a b 当a串是abc,b串是aaa时构造的名字是aab

a b , a 此时就是因为a串先把b放在了末尾,然后前两个位置就都是a

a ( l e n + 1 ) / 2 所以应该提前取出a串要放的(len+1)/2个最小的字母

b l e n / 2 取出b串要放的len/2个字母

a , , 当a串比较大的时候,肯定是拿最大的字母放到末尾,因为迟早要放

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
char a[maxn],b[maxn],ans[maxn];
int main()
{
	cin >> (a+1) >> (b+1);
	int len=strlen(a+1);
	sort(a+1,a+1+len);
	sort(b+1,b+1+len);
	reverse(b+1,b+1+len);
	int l1=1,l2=1,r1=(len+1)/2,r2=len/2,l=1,r=len;
	for(int i=1;i<=len;i++)
	{
		if(i%2==1)
		{
			if(a[l1]<b[l2])	ans[l++]=a[l1++];//a小,肯定放小的 
			else	ans[r--]=a[r1--];//否则后面b都会比a小,那a就放最后面 
		}
		else
		{
			if(b[l2]>a[l1])	ans[l++]=b[l2++];//b大,肯定放前面 
			else	ans[r--]=b[r2--];
		}	
	}
	cout<<(ans+1);
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107223938