贪心算法——字典序最小问题,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 ...
随机推荐
- 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...
- js飘窗
广告页上总会出现飘窗效果: adver_pos_id = getOtherParameter("id"); adver_Sid = getOtherParameter(" ...
- CADO SAP tcode - Time Sheet: Display Data
CADO (Time Sheet: Display Data) is a standard SAP transaction code available within R/3 SAP systems ...
- 使用kafka consumer api时,中文乱码问题
使用Intelli idea调试kafka low consumer时,由于broker存储的message有中文, idea中console端是可以正确显示的 然后mvn package打包到服务器 ...
- MaxScript与外部程序通讯
最近项目要求通过java给max发送任务指令,max接收指令执行任务,并且返回执行的结果.不管为什么会有这样的需求,有就要去实现. 1.OLE开启 Max本身提供了一个方式,它可以将自己注册成一个Ol ...
- php用smarty来做简易留言系统,明细步骤简单操作
留言信息是之前用php做过的一个例子,现在把它用smarty模板来做 大概是这样子 点击发布信息 然后填写内容,发送后会返回表格,写的内容都会出现在表格里 数据库的数据是这样的: 先建两个文件.php ...
- Python 排错UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法
Python UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法 by:授客 QQ:1033553122 错误描述: py ...
- linux并发服务器设计
linux 并发服务器: http://blog.csdn.net/ygl840455828ygl/article/details/52438167 http://www.2cto.com/os/20 ...
- Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences
Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...
- JavaScript arguments对象
1.在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性.arguments非常类似Array,但实际上又不是一个Array实例.可以通过如下代码得以证 ...