题目描述

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. python学习之老男孩python全栈第九期_day015作业_老男孩Python全9期练习题(面试真题模拟)

    一. 选择题(32分) 1. python不支持的数据类型有:AA. charB. intC. floatD. list 2. Ex = ‘foo’y = 2print(x + y)A. fooB. ...

  2. Linux服务器开启ssh服务,实现ssh远程登陆!

    最近在学linux,使用ssh远程登陆linux,记录下来! 首先进入/etc目录下,/etc目录存放的是一些配置文件,比如passwd等配置文件,要想使用ssh远程登陆,需要配置/etc/ssh/s ...

  3. PHP文件上传,下载,Sql工具类!

    PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用 前台 upload.html <!DOCTYPE html> <html> & ...

  4. python 递归和二分法

    一 内置函数 1. revserd 翻转,返回的是迭代器 # 将 s 倒置 s = '不是上海自来水来自海上' # 方法一 print(s[::-1]) # 方法二 s1 = reversed(s) ...

  5. BZOJ5473: 仙人掌

    传送门 首先,所有连通块的个数的期望再减去每个点孤立的概率就是答案. 设 \(d_i\) 表示 \(i\) 的度数,那么每个点孤立的概率为 \(\frac{1}{2^{d_i}}\) 考虑计算所有连通 ...

  6. UWP开发细节记录:IStream 和 IRandomAccessStream^ 以及 IMFByteStream 互转

    IStream 和 IRandomAccessStream^ 互转 IRandomAccessStream^ --> IStream:  CreateStreamOverRandomAccess ...

  7. 【Python】爬取网站图片

    import requests import bs4 import urllib.request import urllib import os hdr = {'User-Agent': 'Mozil ...

  8. oracle学习之pl/sql使用==转载

    PLSQL循序渐进全面学习教程(全):https://blog.csdn.net/spark998/article/details/2065269

  9. SQL Server登录方式

    SQL Server登录服务器有两种验证方式,一种是windows身份验证,也就是本机验证,另一种就是SQL Server验证,就是使用账号密码的方式验证. 在使用windows身份验证登录时,直接就 ...

  10. FinalShell使用---Xshell的良心国产软件

    最近发现了一款同类产品FinalShell,还是一块良心国货.初步体验了一下,确实是良心之作.且免费(通用版),支持国货. FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还 ...