213. 字典序最小问题 Best Cow Line(挑战程序设计竞赛)
地址 https://www.papamelon.com/problem/213
给定一个字符 S,长度为 N。由 S 构成出新的字符串 T,长度也为 N。
起初 T 是一个空串,然后执行 N 次操作,每次操作有两种选择:
从 S 头部删除一个字符,加到 T 的尾部
从 S 尾部删除一个字符,加到 T 的尾部
我们要决定一种最优的操作方案,使得 T 串的字典序最小。
输入
第一行整数 N(1≤N≤2000),表示 S 串的长度
接下来 N 行,每行一个大写英文字符,表示 S 串的每个字符
输出
输出一行或多行:每行最多 80 个字符,当 T 串太长,需要换行再继续输出
样例 1
输入
6
A
C
D
B
C
B
输出
ABCBCD
解答
贪心算法
从字符串S中左右两端取出字典序较小的那个 放入T中 比如 s= acdb 那么最后 t=abcd
需要考虑的特殊情况就是 两边都相同的情况下 s= abccccba,那么需要左右双指针同时向中间移动监测,直到某一边出现了字典序较小的结果,或者两端相遇 那就随机选择
// 11111.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
const int N = 2010;
char S[N];
int n;
int Check(int l, int r) {
int ret = -1;
int ll = l; int rr = r;
while (ll < rr) {
if (S[ll] > S[rr]) { ret = r; break; }
else if (S[ll] < S[rr]) { ret = l; break; }
else {
ll++; rr--;
}
}
if (ret == -1) ret = l;
return ret;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) {
cin >> S[i];
}
int l = 0; int r = n - 1;
string ans;
while (l <= r) {
if (S[l] > S[r]) { ans += S[r]; r--; }
else if (S[l] < S[r]) { ans += S[l], l++; }
else {
//s[l]==s[r]
int idx = Check(l,r);
ans += S[idx];
if (idx == l)l++;
else r--;
}
}
for (int i = 0; i < ans.size(); i++) {
if (i % 80 == 0 && i != 0) { cout << endl; cout << ans[i]; }
else {cout << ans[i];}
}
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2018-01-02 windows下使用redis c++