#414 Div2 C

题意

两个人每个人都有一串字母序列,他们要替换一个长度为 n 包含问号的新序列,他们每次可以使用自己序列中的字母代替新序列的问号(使用自己序列中的字母后那个字母就会消失),第一个人想要形成的序列字典序尽可能小,第二个人则希望尽可能大,两人操作不失误,第一个人先操作,问形成的新序列。

分析

首先排序,如果 n 为偶数,显然第一个人用到的字母是自己序列的前一半,而后一个人则是自己序列的后一半,一开始两人都尽可能的想要把字典序小的字母或字典序大的字母向前放,直到第一个人所操作到的字母字典序大于等于第二个人操作到的字母的字典序,那么第一个人一定想把大的放到后面,第二个人想把小的放到后面,按这样的规则倒序插入剩下的数字即可。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3e5 + 10;
string s1, s2;
char ans[MAXN];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> s1 >> s2;
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
int L = s1.length();
int mxl = (L + 1) / 2;
int l = 0, r = L - 1, c = 0, cnt = 0;
int ff = 0;
while(s1[l] < s2[r]) {
ans[c++] = s1[l++];
cnt++;
if(cnt == L) break;
if(s2[r] <= s1[l]) {
ff = 1;
break;
} else {
ans[c++] = s2[r--];
cnt++;
}
if(cnt == L) break;
}
int rr = mxl; // 第二个序列需要填入的序列段的最左端
mxl--; // 第一个序列需要填入的序列段的最右端
for(int i = L - 1; i >= 0; i--) {
if(ans[i] == 0) {
if(!ff) {
ans[i] = s1[mxl--];
cnt++;
ff = 1;
} else {
ans[i] = s2[rr++];
ff = 0;
cnt++;
}
}
if(cnt == L) break;
}
ans[L] = 0;
cout << ans << endl;
return 0;
}

最新文章

  1. Chapter 3: Develop the user experience
  2. Swift2.1 语法指南——访问控制
  3. hibernate(二)一级缓存和三种状态解析
  4. 评价网站UI--北京邮电大学首页
  5. java IO和NIO 的区别
  6. @include与jsp:include的区别
  7. MFC记住上次路径---遇到的一些问题
  8. 感觉Release有时比Debug要健壮
  9. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
  10. 局域网里连接mysql服务器,其他人连接自己的mysql服务器
  11. Vue.js安装
  12. 腾讯云服务器SMTP ERROR: Failed to connect to server
  13. 模拟用户登录(获取cookie/实例化session)
  14. JVM自动内存管理机制——Java内存区域(上)
  15. Python3.5+PyQt5多线程+itchat实现微信防撤回桌面版代码
  16. java⑩
  17. jquery过滤class为aa的div
  18. 阿里云oss怎么上传文件夹
  19. [数据库系列之MySQL]Mysql优化笔记
  20. Python学习札记(七) Basic4 条件判断

热门文章

  1. Apriori算法(C#)
  2. GitHub上非常受开发者欢迎的iOS开源项目(二)
  3. 使用Entity Framework时遇到的问题
  4. CSS新内容
  5. SparkStreaming官方示例程序运行方式
  6. 使用 rsync 同步
  7. 蓝桥杯-兰顿蚂蚁-java
  8. Android VideoView使用小记
  9. MNIST机器学习
  10. Python之collections序列迭代器下标式循环冒泡算法等