原题链接:http://poj.org/problem?id=3617

问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 。起初, 是一个空串,随后反复进行下列任意操作。

  • 的头部删除一个字符,加到 的尾部。
  • 的尾部删除一个字符,加到 的尾部。

目的是要构造字典序尽可能小的字符串

    限制条件:

  • 字符串 只包含大写英文字母
  • 输出的字符串每 80 个字符进行一次换行

字典序是指从前到后比较两个字符串大小的方法。首先比较第 1 个字符,如果不同则第 1 个字符较小的字符串更小,如果相同则继续比较第 2 个字符......如此继续,来比较整个字符串的大小。

问题分析:从字典序的性质上看,无论 的末尾有多大,只要前面部分的较小就可以。所以我们可以试一下如下贪心算法:

  • 不断取 的开头和末尾中较小的一个字符放到 的末尾。

这个算法已经接近正确了,只是针对 的开头和末尾字符相同的情形还没有定义。在这种情形下,因为我们希望能够尽早使用更小的字符,所以就要比较下一个字符的大小。下一个字符也有可能相同,因此就有如下算法:

  • 按照字典序比较 和将 反转后的字符串
  • 如果 较小,就从 的开头取出一个文字,追加到 的末尾;
  • 如果 较小,就从 的末尾取出一个文字,追加到 的末尾;
  • 如果相同则取哪个都可以。

根据前面提到的性质,字典序比较类的问题经常能用得上贪心法。


代码如下:

#include <iostream>
#include <algorithm>
using namespace std; const int MAX = 2000;
// 输入
int N;
char S[MAX + 1]; void solve() {
// 剩余的字符串为 S[a], S[a+1],...., S[b]
int a = 0, b = N - 1, flag = 0; while (a <= b) { // 将从左起和从右起的字符串比较
bool left = false;
for (int i = 0; a + i <= b; i++) {
if (S[a + i] < S[b - i]) {
left = true;
break;
}
else if (S[a + i] > S[b - i]) {
left = false;
break;
}
} if (left) cout << (S[a++]), flag++;
else cout << (S[b--]), flag++;
if (flag == 80) cout << endl, flag = 0;
}
cout << endl;
} int main() {
while (cin >> N) {
for (int i = 0; i < N; i++)
cin >> S[i]; solve();
}
return 0;
}

POJ 3617 Best Cow Line (字典序最小问题 & 贪心)的更多相关文章

  1. POJ 3617 Best Cow Line 字典序最小

    #include<cstdio> #include<iostream> #include<algorithm> #include<queue> #inc ...

  2. POJ 3617 Best Cow Line(最佳奶牛队伍)

    POJ 3617 Best Cow Line Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] FJ is about to t ...

  3. POJ 3617 Best Cow Line ||POJ 3069 Saruman's Army贪心

    带来两题贪心算法的题. 1.给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下面两个操作:1.从S的头部删除一个字符,加到T的尾部.2.从S的尾部删除一个字符,加 ...

  4. poj 3617 Best Cow Line 贪心模拟

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42701   Accepted: 10911 D ...

  5. POJ 3617 Best Cow Line (贪心)

    Best Cow Line   Time Limit: 1000MS      Memory Limit: 65536K Total Submissions: 16104    Accepted: 4 ...

  6. poj 3617 Best Cow Line (字符串反转贪心算法)

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9284   Accepted: 2826 Des ...

  7. POJ 3617 Best Cow Line 贪心算法

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26670   Accepted: 7226 De ...

  8. 贪心算法训练(九)——Best Cow Line(字典序最小问题)

    原题链接:Best Cow Line 1. 问题描述 2. 输入 6 A C D B C B 3. 输出 ABCBCD 4.思路分析 不断地取原字符串 S 中开头和末尾比较小的字符串放到 T 的末尾 ...

  9. poj 3623 Best Cow Line, Gold 后缀数组 + 贪心

    题目链接 题目描述 对于一个给定的字符串,可以从左右两端取字符,依次排列构成一个新的字符串. 求可能构成的字符串中字典序 最小的一个. 例:ACDBCB -> ABCBCD 思路 参考自 xue ...

随机推荐

  1. 配置文件管理维护到gitlab上

    一.简介 在日常维护服务器中,会修改配置文件或者相应脚本,在修改前要对文件进行按照日期备份,这样会很麻烦,频繁修改的时候也会懒得去备份多个. 维护脚本分为服务端和客户端,服务端监听端口,接收客户端的采 ...

  2. Oracle命名规则

    1.长度不能超过三十个字符 2. 不要使用Oracle关键字 比如:id  name  table 3. 不能使用数字开头 包含:数字  字母  下划线 美元符号 4.  建议用 英文单词,不要去用中 ...

  3. [BUUCTF]PWN——jarvisoj_level3

    jarvisoj_level3 附件 步骤 例行检查,32位,nx保护 运行一下程序 32位ida载入,shift+f12没有看到程序里有可以直接利用的后面函数,根据运行时的字符串找到了程序的关键函数 ...

  4. [BUUCTF]PWN——bjdctf_2020_babyrop

    bjdctf_2020_babyrop[64位libc泄露] 题目附件 解题步骤: 例行检查,64位程序,开启了NX保护 试运行一下程序,看看大概的情况,看提示,应该是道泄露libc的题目 64位id ...

  5. Table.RenameColumns重命名…Rename…(Power Query 之 M 语言)

    数据源: "姓名""基数"等列 目标: 修改"姓名"列标题为"员工姓名" 操作过程: [转换]>[重命名]> ...

  6. Excel里的格式会自动变成日期或会计专用吗?(Excel技巧集团)

    Excel里的格式会自动变成日期或会计专用? 正常情况下当然不会了,可是最近却有很多很多同学问这样的问题,并把这个问题列成了Excel2007和2010的一个Bug,可是小妖同学却从来没遇到过这样的问 ...

  7. Python3 shevel模块,更高级的json序列化数据类型模块(比pickle更高级)

    直接将数据类型以字典的格式 存到文件中去. 直接.get读取出来,

  8. 【LeetCode】495. Teemo Attacking 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 【LeetCode】458. Poor Pigs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. 1161 - Extreme GCD

    1161 - Extreme GCD    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB All ...