贪心算法——字典序最小问题,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 ...
随机推荐
- HDU4845(SummerTrainingDay02-C 状态压缩bfs)
拯救大兵瑞恩 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- SpringMVC注解集合
@RequestMapper注解 绑定请求路径与处理方法例如: @RequestMapping("login.do") public String showLogin() { .. ...
- dubbo 图片服务器(FastDFS) redis solr ActiveMQ等简单配置使用
一.dubbo 项目基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询需要两个系统之间进行通信. 1.1如何实现远程通信? 1.Webservice:效率不高基于soap协议.项目中 ...
- autocad.net-图片打印合成
调用打印程序“PublishToWeb JPG.pc3”进行图片打印,该打印驱动程序中内置了很多的打印方案,在同尺寸的打印方案下,数据范围越大打印出来的清晰度就越差,内置的尺寸不一定都满足,在又要通过 ...
- WOSA/XFS PTR FORM—基础知识
目录 一.XFS PTR 二.XFS PTR FORM 三.Form.子Form.字段.框架.表单和媒介的定义 正文 一.XFS PTR Class Name PTR Class Identifier ...
- RecyclerView-- 侧滑删除和拖动排序
实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么 ItemTouchHelper.Callback 默认需要 ...
- Java实现后缀表达式建立表达式树
概述 表达式树的特点:叶节点是操作数,其他节点为操作符.由于一般的操作符都是二元的,所以表达式树一般都是二叉树. 根据后缀表达式"ab+cde+**"建立一颗树 文字描述: 如同后 ...
- Oracle EBS OPM release step
--release_step生产批 --created by jenrry SET serveroutput on DECLARE x_return_status VARCHAR2 (1); l_ex ...
- LUA 运算笔记
循环 比如要实现这样的一个For for(int i=10;i>1;i—) { print(i) } lua的for循环 转换成LUA for i=10,1,-1 do print(i) end ...
- 怎样使用 virt-viewer 远程访问 qemu 虚拟机 - 转载
How to connect to a VM hosted on QEMU remotely using virt-viewer I couldn’t find comprehensive artic ...