贪心算法——字典序最小问题,Saruman‘s Army
题目描述
Best Cow Line (POJ 3617)
给定长度为N的字符串S,要构造一个长度为N字符串T。T是一个空串,反复执行下列任意操作:
- 从S的头部删除一个字符,加到T的尾部;
从S的尾部删除一个字符,加到T的尾部;
目标是要构造字典序尽可能小的字符串T。

限制条件
- 1 <= N <= 2000
字符串 S 只包含大写英文字母
样例输入
N = 6
S = “ACDBCB”
样例输出
ABCBCD (如下图所示进行操作)

思路分析
- 不断取S的开头和结尾中较小的一个字符放到T的末尾。
- 按照字典序比较S 和S反转后字符串S‘。
- 如果S较小,就从S 的开头取出一个文字,追加的T 的末尾。
- 如果S’较小,就从S的末尾取出一个文字,追加的T 的末尾。(如果相同则取哪个都可以)
AC 代码
# include <cstdio>
# include <iostream>
const char MAX_N = 10000;
using namespace std;
char S[MAX_N + 1];
int N;
void solve()
{
//剩下的字符串为S[a],S[a+1],......,S[b]
int a = 0;
int b = N - 1;
while (a <= b)
{
//将从左起和右起的字符串比较
bool left = false;//先声明最左边为假,才能运行下面的代码
for (int i = 0; a + i <= b; i++)
{
if (S[a + i] < S[b - i])
{
left = true;
break;//如果最左边的小,那么直接跳出for 循环,把最左边的字符给T
}
else if (S[a + i] > S[b - i])
{
left = false;
break;
}
}
if (left)
putchar(S[a++]);
else
putchar(S[b--]);
}
putchar('\n');
}
int main()
{
scanf("%d", &N);
getchar();//这个是必须的,因为solve函数中有个 putchar('\n');要把这个给“吃掉才可以”
for (int i = 0; i < N; i++)
{
scanf("%c", &S[i]);
}
solve();
return 0;
}
小结
对于题目中的思路解析有点说明的地方——字典序。字典序是指从前到后比较两个字符串大小的方法。首先比较1个字符,如果不同则第1个字符较小的字符串更小,如果相同则继续比较2个字符......以此类推,来比较整个字符串的大小。
题目描述
直线上有N个点。点i的位置是\(X_i\)。从这N个点中选择若干个,给它们加上标记。对每一个点,其距离为R以内的区域里必须又带有标记的点(自己本身带有标记的点,可以认为与其距离为0的地方有一个带有标记的点)。在满足这个条件的情况下,希望能为尽可能少的点添加标记。请问至少要有多少点被加上标记?
样例输入
N = 6
R = 10
X ={1,7,15,20,30,50}
样例输出
3(如下图所示)

思路分析
从最左边的点开始,距离R以内最远的点然后在把标记的点作为最左边的点,进行相同的操作。
AC代码
# include <iostream>
# include <algorithm>
using namespace std;
const int maxn = 1000;
int n, r;
int x[maxn];
void solve()
{
sort(x, x + n);
int i = 0;
int ans = 0;
while (i < n)
{
//s 是没有被覆盖的最左边点的位置
int s = x[i++];
while (i < n && x[i] <= s + r)//一直向右前进知道距s的距离大于r的点
i++;
int p = x[i - 1];//p是新加上标记的点的位置
while (i < n && x[i] <= p + r)//一直向右前进直到距p的距离大于r的点
i++;
ans++;
}
printf("%d\n", ans);
}
int main()
{
scanf("%d %d", &n,&r);
for (int i = 0; i < n; i++)
{
scanf("%d", &x[i]);
}
solve();
return 0;
getchar();
getchar();
}
贪心算法——字典序最小问题,Saruman‘s Army的更多相关文章
- BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心【字典序最小】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1640 题意: 给你一个长度为n的字符串. 你可以将原串的首字母或尾字母移动到新串的末尾. ...
- POJ 3617 Best Cow Line ||POJ 3069 Saruman's Army贪心
带来两题贪心算法的题. 1.给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下面两个操作:1.从S的头部删除一个字符,加到T的尾部.2.从S的尾部删除一个字符,加 ...
- Saruman's Army(贪心)
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- POJ 3617 Best Cow Line (字典序最小问题 & 贪心)
原题链接:http://poj.org/problem?id=3617 问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 .起初, 是一个空串,随后反复进行下列任意操作. 从 的头部删除 ...
- POJ 3069 Saruman's Army(贪心)
Saruman's Army Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- poj 3069 Saruman's Army(贪心)
Saruman's Army Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tot ...
- POJ3069 Saruman's Army【贪心】
Saruman the White must lead his army along a straight path from Isengard to Helm's Deep. To keep tra ...
- poj 3069 Saruman's Army 贪心模拟
Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18794 Accepted: 9222 D ...
随机推荐
- TFS 打得你措手不及!TF53001:管理员已取消数据库操作
心塞.公司TFS突然挂了.签入获取 一直报 TF53001:管理员已取消数据库操作.公司开发部开发进度一下就受阻了.刚好有时关键时期. 在 老总的帮助下根据搜到的资料 .搞定了这个问题!问题出在数据库 ...
- (一)认识Sass和Compass
第一章 Sass和Compass让样式表重焕青春 // 内容概要// 开始学习Sass和动态样式表// 用Sass更高效地写样式表// Compass简介// 用Compass迎接工程实践中的样式挑战 ...
- 【机器学习】EM算法详细推导和讲解
今天不太想学习,炒个冷饭,讲讲机器学习十大算法里有名的EM算法,文章里面有些个人理解,如有错漏,还请读者不吝赐教. 众所周知,极大似然估计是一种应用很广泛的参数估计方法.例如我手头有一些东北人的身高的 ...
- MySQL中使用连接查询
连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)! 连接查询的意义: 在用户查看数据的时候 ...
- element-ui Tag、Dialog组件源码分析整理笔记(五)
Tag 标签组件 <script> export default { name: 'ElTag', props: { text: String, closable: Boolean, // ...
- SD从零开始31-32
SD从零开始31 包装(Packing) 装运材料Shipping Materials Shipping materials是用来包装或者运输货物的材料: 为了在系统中为outbound delive ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 2
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 1------------------- 建立如下数据表 CREATE ...
- Html5+离线打包创建本地消息
自己离线打包Html5+ Runtime,通常是导入SDK的Hello实例,然后修改.在做消息通知功能时,使用push.createMessage不起作用. 首先参考Android平台离线打包推送插件 ...
- JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)
JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架) 本来想实现 QQ 登录,有域名一直没用过,还得备案,好麻烦,只能过几天再更新啦. 先把实现的发送邮箱验证码更能更新了. 老规矩,更多内容在注释 ...
- 如何在 Azure 中均衡 Windows 虚拟机负载以创建具有高可用性的应用程序
负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性. 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性. 你将学习如何执行以下操作: 创建 Azure 负载 ...