题目描述

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的更多相关文章

  1. BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心【字典序最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1640 题意: 给你一个长度为n的字符串. 你可以将原串的首字母或尾字母移动到新串的末尾. ...

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

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

  3. Saruman's Army(贪心)

    Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...

  4. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

  5. POJ 3617 Best Cow Line (字典序最小问题 & 贪心)

    原题链接:http://poj.org/problem?id=3617 问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 .起初, 是一个空串,随后反复进行下列任意操作. 从 的头部删除 ...

  6. POJ 3069 Saruman's Army(贪心)

     Saruman's Army Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  7. poj 3069 Saruman's Army(贪心)

    Saruman's Army Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tot ...

  8. POJ3069 Saruman's Army【贪心】

    Saruman the White must lead his army along a straight path from Isengard to Helm's Deep. To keep tra ...

  9. poj 3069 Saruman's Army 贪心模拟

    Saruman's Army Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18794   Accepted: 9222 D ...

随机推荐

  1. JQuery 节点监听

    DOMSubtreeModified: 在DOM结构发生任何变化的时候.这个事件在其他事件触发后都会触发: $(".attr_box").bind("DOMSubtree ...

  2. Ckeditor失去焦点前保留光标位置

    var $selection = CKEDITOR.instances.myEditor.getSelection();//当前选中区域 var $bookmarks = $selection.cre ...

  3. 葡萄城报表 SP2 新特性(1)— 单元格智能合并

    中国式复杂报表的布局,因为数据的动态性和结构性,导致其布局往往是无规律,且在设计时无法预测的,如单元格合并,通常不仅希望在每一列的数据展现中,能够根据需要自动将相同的单元格合并,且每个单元格之间该属性 ...

  4. 解决跨域问题之anywhere

    anywhere搭建服务,ionic PC端和手机端可以通过网址来查看网页效果.解决跨域问题 大家都知道编写完HTML代码后,可以直接在pc端的浏览器查看,但现在手机端越来越广泛了,想跟在pc端查看网 ...

  5. Expo大作战(三)--针对已经开发过react native项目开发人员有针对性的介绍了expo,expo的局限性,开发时项目选型注意点等

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  6. 【转】设置Qt应用程序图标及应用程序名

    一直以来很纠结给qt应用程序添加图标问题,在网上收过一次,但是感觉不够完整,现将自己的实现过程记录下,以便以后查看: 通过网上的例子知道qt助手中有相关说明: Setting the Applicat ...

  7. 文科妹学 GitHub 简易教程

      #什么是 Github ?必须要放这张图了!!!<img src="https://pic4.zhimg.com/7c9d3403bf922b1663f56975869c829b_ ...

  8. Chained Declustering

          此论文描述了在无共享架构的多处理器机器上的数据库系统的数据冗余分布方法.该方法提高了系统的可用性,同时在单节点故障的情况下,可以很好的实现负载均衡.以下是论文的一些摘要,详细可以参见论文原 ...

  9. 转:.NET面试题汇总(三)

    原文地址:http://www.cnblogs.com/yuan-jun/p/6600692.html 1.简述 private. protected. public. internal 修饰符的访问 ...

  10. touch创建文件

    创建文件 在cs目录下创建1.txt和2.txt文件 touch ./文件名.txt 或者 touch /root/cs 文件名.txt 或者 echo > ./文件名.txt 或者 >. ...