题目描述

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. 用01随机函数构造[a,b]整数范围随机数

    #include <stdio.h> #include <stdlib.h> #define RAND_0_1 (rand()&0x1) int random(int ...

  2. python-观察者模式

    源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 存在这样的一种情况:公司领导再开例会那天临时有事,他让秘书给所有会上员工群发了一 ...

  3. 地区picker 各选择器,优劣分析

    移动端选择器picker有很多,各大ui组件都有自己的picker,比如light7,HUI,MUI,jqueryUI等等.但是,我发现他们都有各种各样的问题.这次的地区选择,需要地区的省份+市+经纬 ...

  4. X86和X64环境下的基本类型所占用的字节大小

    同样的程序代码,使用Visual Studio 进行编译,当目标平台分别为x86或x64环境时,其编译结果是不同的.在x86环境下,指针都是4个字节的:而在x64环境下,指针都是8字节的.测试代码如下 ...

  5. RecyclerView--添加头部和底部

    1.先构建WrapRecyclerAdapter /** * Description: 可以添加头部和底部的Adapter */ public class WrapRecyclerAdapter ex ...

  6. 关于Mobx中装饰器语法的环境配置

    1.弹出项目配置 npm run eject 此处注意,若弹出项目配置失败,请先执行以下两行代码(若没有安装git则请跳过,本人是在安装git的情况下解决问题的) 1.git add . 2.git ...

  7. Ubuntu 18.04 Server 设置静态IP

    一.背景 Netplan是Ubuntu 17.10中引入的一种新的命令行网络配置实用程序,用于在Ubuntu系统中轻松管理和配置网络设置.它允许您使用YAML抽象来配置网络接口.它可与NetworkM ...

  8. LeetCode题解之 Search in a Binary Search Tree

    1.题目描述 2.问题分析 利用递归遍历二叉查找树. 3.代码 TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL) ret ...

  9. 重学C语言---05运算符、表达式和语句

    一.循环简介 实例程序 /*shoes1.c--把一双鞋的尺码变为英寸*/#include <stdio.h>#define ADJUST 7.64#define SCALE 0.325 ...

  10. Prometheus Node_exporter 之 Memory Detail Meminfo /proc/meminfo

    1. Memory Active / Inactive type: GraphUnit: bytesLabel: BytesInactive - 最近使用较少的内存, 优先被回收利用 /proc/me ...