本文共 1439 字,大约阅读时间需要 4 分钟。
怎 么 说 呢 ? 这 题 还 是 很 有 迷 惑 性 的 怎么说呢?这题还是很有迷惑性的 怎么说呢?这题还是很有迷惑性的
比较容易想到的做法肯定是每次拿a串最小的字母构造字典序最小
每次拿b串最大的字母构造字典序最大
那 么 假 设 当 前 q 为 a 串 最 小 字 母 , w 为 b 串 最 大 字 母 那么假设当前q为a串最小字母,w为b串最大字母 那么假设当前q为a串最小字母,w为b串最大字母
Ⅰ . 构 造 字 典 序 最 小 时 : q < = w , 尽 量 往 左 边 放 Ⅰ.构造字典序最小时:q<=w,尽量往左边放 Ⅰ.构造字典序最小时:q<=w,尽量往左边放
如 果 q > w , 说 明 b 串 后 面 的 字 母 都 很 小 , 那 就 尽 量 往 右 边 放 置 如果q>w,说明b串后面的字母都很小,那就尽量往右边放置 如果q>w,说明b串后面的字母都很小,那就尽量往右边放置
Ⅱ . 构 造 字 典 序 最 大 时 : 和 上 面 思 路 一 样 , 只 是 顺 序 反 一 下 Ⅱ.构造字典序最大时:和上面思路一样,只是顺序反一下 Ⅱ.构造字典序最大时:和上面思路一样,只是顺序反一下
看起来显然的贪心策略,居然是错的!!!
当 a 串 是 a b c , b 串 是 a a a 时 构 造 的 名 字 是 a a b 当a串是abc,b串是aaa时构造的名字是aab 当a串是abc,b串是aaa时构造的名字是aab
此 时 就 是 因 为 a 串 先 把 b 放 在 了 末 尾 , 然 后 前 两 个 位 置 就 都 是 a 此时就是因为a串先把b放在了末尾,然后前两个位置就都是a 此时就是因为a串先把b放在了末尾,然后前两个位置就都是a
所 以 应 该 提 前 取 出 a 串 要 放 的 ( l e n + 1 ) / 2 个 最 小 的 字 母 所以应该提前取出a串要放的(len+1)/2个最小的字母 所以应该提前取出a串要放的(len+1)/2个最小的字母
取 出 b 串 要 放 的 l e n / 2 个 字 母 取出b串要放的len/2个字母 取出b串要放的len/2个字母
当 a 串 比 较 大 的 时 候 , 肯 定 是 拿 最 大 的 字 母 放 到 末 尾 , 因 为 迟 早 要 放 当a串比较大的时候,肯定是拿最大的字母放到末尾,因为迟早要放 当a串比较大的时候,肯定是拿最大的字母放到末尾,因为迟早要放
#includeusing 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] a[l1]) ans[l++]=b[l2++];//b大,肯定放前面 else ans[r--]=b[r2--]; } } cout<<(ans+1);}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/107223938 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!