贪心算法——字典序最小问题,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 ...
随机推荐
- Codeforces833A
A. The Meaningless Game time limit per test:1 second memory limit per test:256 megabytes input:stand ...
- 关于子元素的margin-top对父级容器无效
如果不想看那么长,看下面这句话就好了. 刚开始我没看到这个总结时一直是使用自己摸索出来paddin-top解决,发现该方式并不好.亲测给父级加一个overflow不为visiable的属性就直接解决了 ...
- 设计模式(10)--Facade(外观模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使 ...
- JavaScript语法详解:运算符和表达式
本文首发于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 我们在上一篇文章里讲到了JS中变量的概念,本篇文章讲一下运算符和表达式. 比 ...
- 使用 Azure CLI 创建 Windows 虚拟机
Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍如何使用 Azure CLI 部署运行 Windows Server 2016 的虚拟机. 部署完成后,我们连接到服 ...
- Python通过LDAP验证、查找用户(class,logging)
定义一个类,用于初始化ldap连接,验证.查找用户等功能 # -*- coding: UTF-8 -*- import sys reload(sys) sys.setdefaultencoding(' ...
- Hyper-v虚拟化
1.打开Hyper-V管理器,新建虚拟机 2.点击下一步,继续设置 3.设置虚拟机名称和存储位置,点击选择打钩,自定义路径 4.设置虚拟机运行内存 5.设置虚拟机设置好的网络 6.创建虚拟磁盘 7创建 ...
- LeetCode 休闲计划
老年退役选手的 LeetCode 休闲之旅 前言 不知不觉两年多的大学时光悄然流逝,浑浑噩噩的状态似乎从来没有离开过自己. 这两年刷题似乎一直是常态.在退役之后的现在,深感有些东西一段时间没有接触,很 ...
- Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...
- 为什么ConcurrentHashMap的读操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题--为什么它不需要加锁呢? ...