题目描述

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. 【转】android系统常用URI

    android系统管理联系人的URI如下:ContactsContract.Contacts.CONTENT_URI 管理联系人的UriContactsContract.CommonDataKinds ...

  2. HTML标签参考(一)

    hi,小哥哥小姐姐们,我们今天要说的是前端的入门,却也是十分重要的意识的培养哦! • html中的标签数量是很多的,据人统计大概有300个左右,并且每年都会以20-30个的速度增加着,但是这么多的标签 ...

  3. thymeleaf标签使用方法总结

    https://blog.csdn.net/quuqu/article/details/52511933 常用th标签https://www.cnblogs.com/suncj/p/4030393.h ...

  4. flex兼容性问题

    flex在众多手机浏览器上的兼容方案(亲测华为手机自带浏览器) 如果项目使用构建工具,可加autoprefixer来处理,[autoprefixer使用指南] 纯手写css兼容代码,需给每个使用的属性 ...

  5. 高德地图 JS API - 根据地名实现标记定位

    德地图 JS API 使用前的准备工作请参考官方网站说明: https://lbs.amap.com/api/javascript-api/guide/abc/prepare 根据地名实现地图标记定位 ...

  6. 在线报表设计实战系列 – 制作多Y轴组合图表(8)

    葡萄城报表是一套强大的报表开发和系统搭建工具,既能与您开发的报表软件项目紧密集成,也可独立部署运行,支持多数据源,具有无编码.灵活.稳定等特性,可以帮您快速搭建专业的报表软件系统,实现各类报表的设计. ...

  7. CSS 实例之滚动的图片栏

    在一些网站上可以经常看到有一些图片进行持续不断的滚动,这个效果可以通过css的动画效果来实现.具体效果如下 主要原理是通过动画向左移动. 首先给出两组一样的图片(同一行上),让整体图片向左移动一组图片 ...

  8. D3、EChart、HighChart绘图demol

    1.echarts:   <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8" ...

  9. AngularJS简单入门

    什么是AngularJS AngularJS是一款优秀的前端JS框架,是Google多款产品之一,简称ng. ng有着诸多特性,最为核心的是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入 ...

  10. window平台搭建Hudson服务器

    1.1    环境 Microsoft Windows server 2008 x64 1.2    资源下载 TortoiseSVN-1.7.11.23600-x64-svn-1.7.8.msi h ...