题目描述

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. JavaScript--DOM进阶(20)

    // DOM自身存在很多类型,在上一章中有介绍,比如Element类型:表示的是元素节点;再比如Text类型;表示的是文本节点; 一 DOM类型 类型名 说明 Node 表示所有类型值的统一接口,IE ...

  2. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  3. 自定义适用于手机和平板电脑的 Dynamics 365(一):主页

    当用户首次打开适用于手机和平板电脑的 Dynamics 365 时,他们将看到默认为“销售仪表板”的主页. 您可以创建新仪表板或 Web 应用程序中编辑现有仪表板,然后为移动设备启用它们,用户可以选择 ...

  4. Android IOC注解库EasyUI

    EasyUI介绍 1.使用反射机制和注解实现类似于butterknife的IOC框架 2.快速的findViewById和OnClick 3.扩展了click时无网络监测 4.扩展了快速点击监测 使用 ...

  5. Python基础知识之疑点难点

    一.标识符 (1) 标识符不能以数字开头:以下划线开头的标识符具有特殊的意义,使用时需要特别注意. 以单下划线开头(如_foo)的标识符代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 “ ...

  6. 新建maven工程使用webapp插件弹出javax.servlet.http.HttpServlet was not found on the Java Build Path异常

    检查pom.xml文件中是否引用javax.servlet,引用如下所示:

  7. JS里设定延时

    使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延迟一段时间,再进行某项操作. setTimeout("function",tim ...

  8. "==" equals和hashCode的联系和区别

    写这篇文章的目的是自己彻底把三者搞清楚,也希望对你有所帮助. 1."=="运算符对与基本类型(int long float double boolean byte char sho ...

  9. SDN 第二次作业

    问题 1.为什么需要SDN?SDN特点? 答:当今网络快速发展,用户的需求也就日益增加,但网络的创新速度却并没有增加,而是比较缓慢.传统网络中的网络设备是硬件.操作系统.网络应用紧耦合的,每个设备厂商 ...

  10. Lombok 继承时应注意的点

    lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法.即它最终能够达到的效果是:在源码中没 ...