原题链接: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. 替换资源(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 还是那个熟悉的某吃货甲,一天之内给他分配了9.6个工时的吃量,这太不厚道了哈,人家一个人又要开吃又要喝汤,这怎么吃得消呢? ...

  2. CF1064A Make a triangle! 题解

    Content 有三条长度分别为 \(a,b,c\) 的线段.你可以在一个单位时间内将一条线段的长度增加 \(1\),试求出能使这三条线段组成一个三角形的最短时间. 数据范围:\(1\leqslant ...

  3. CF570A Elections 题解

    Content 有 \(n\) 个候选人和 \(m\) 个城市,每个城市可以给每个候选人投票,已知第 \(i\) 个城市给第 \(j\) 个人投的选票数是 \(a_{i,j}\).我们将第 \(i\) ...

  4. 音视频中的PTS和DTS及同步

    视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉.       但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都 ...

  5. 面试官问我TCP三次握手和四次挥手,我真的是

    候选者:面试官你好,请问面试可以开始了吗 面试官:嗯,开始吧 面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗? 候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手的流程吧 候 ...

  6. 创建具有root权限的账号

    第一种 # guest:123456 useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root ...

  7. SpringBoot整合nacos启动报错:java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata

    报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosCo ...

  8. 【LeetCode】281. Zigzag Iterator 解题报告 (C++)

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

  9. B. Recover the String

    B. Recover the String time limit per test 1 second memory limit per test 256 megabytes input standar ...

  10. 【计算机组成】 Quartus II 关于总线data[][]转换多个总线data[]时不成功的问题

    xjtuse 直接使用报错: 加中间层不报错: