C. Naming Company(细节,贪心)
发布日期:2021-06-30 10:18:03 浏览次数:2 分类:技术文章

本文共 1439 字,大约阅读时间需要 4 分钟。

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

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

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

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

Ⅰ . 构 造 字 典 序 最 小 时 : 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 aabc,baaaaab

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

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

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

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

#include 
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]
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:D. Driving Test(贪心+栈)
下一篇:C. Minimal string(贪心法,栈)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月07日 11时34分50秒