贪心:字典序最小问题

*/-->

pre.src {background-color: Black; color: White;}

pre.src {background-color: Black; color: White;}

贪心:字典序最小问题

给定长度为 n 的字符串 s,要构造一个长度为 n 的字符串 t。起初,t 是一个空串,随后反复进行下列操作
1. 从 s 的头部删除一个字符,加到 t 的尾部
2. 从 s 的尾部删除一个字符,加到 t 的尾部
求 t 是字典序尽可能小的字符串
示例:
  n = 6
  s = "ACDBCB"
    构造 t
      t: a            s: cdbcb
      t: ab           s: cdbc
      t: abc          s: cdb    # 注意这里选择的 c 的方向,选错了就不是最小
      t: abcb         s: cd
      t: accbc        s: d
      t: abcbcd       s:

看算法实现吧,很容易明白的,反正我是看明白了

// CreateTime: 2015-04-07 21:55:59

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>

using namespace std;

string s;
string t;

void solve() {
    cin >> s;
    int len = s.length();
    int l = 0;
    int r = len-1;

    int sub = 0;

    while (l <= r) {
        bool left = 0;
        for (int i = 0; l+i <= r; i++) {
            if (s[l+i] < s[r-i]) {
                left = 1;
                break;
            } else if (s[l+i] > s[r-i]) {
                left = 0;
                break;
            }
        }
        if (left) {
            t[sub++] = s[l++];
        } else {
            t[sub++] = s[r--];
        }
    }
    t[sub] = ‘\0‘;
//    cout << t << endl;         // 不明白为什么不能输出
    cout << t.c_str() << endl;
}

int main(void) {
    solve();

    return 0;
}
时间: 2024-10-12 03:53:24

贪心:字典序最小问题的相关文章

uva 714 - Copying Books(贪心 最大值最小化 二分)

题目描述开头一大堆屁话,我还仔细看了半天..其实就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,如果最小值相同情况下有多种分配方案,输出前面份数小的,就像字典序输出从小到大一样的意思. 这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值.如何确定这个x就是用的二分法,x一定大于0小于所有值的合,不断的二分再判断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失

ZOJ 3204 Connect them(最小生成树之Krusal 输出字典序最小的)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers i and j is

poj 1815 Friendship 字典序最小+最小割

题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all the people are very busy, they communicate with each other only by phone. You can assume that people A can keep in touch with people B, only if 1. A kno

hdu1385 Minimum Transport Cost 字典序最小的最短路径 Floyd

求最短路的算法最有名的是Dijkstra.所以一般拿到题目第一反应就是使用Dijkstra算法.但是此题要求的好几对起点和终点的最短路径.所以用Floyd是最好的选择.因为其他三种最短路的算法都是单源的. 输出字典序最小的路径则需要修改模版. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N =1

[poj2337]求字典序最小欧拉回路

注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识了... CE怎么办啊...g++来救? #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define N 2020

C - 字典序最小的子序列 51nod1255

C - 字典序最小的子序列 Time Limit: 4000/2000 MS (Java/Others)      Memory Limit: 1280000/640000 KB (Java/Others) Submit Status Problem Description 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:1.包含字符串中所有出现过的字符各1个.2.是所有满足条件1的串中,字典序最小的.例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,

HDU 5335 Walk Out(Bfs搜索字典序最小的最短路)

 题意:nXm的地图, 问通过四个方向从(1,1)走到(1000,1000)所经过的最小二进制序列是多少,忽略前缀0. 思路:首先如果起点为0,那么我们bfs搜索和起点0联通的为0的连通块,这样我们第一步肯定是从与这个连通块相邻的且与重点最近的地方出发. 将所有可能起点加入队列,在bfs一遍找到字典序最小的那条路就是答案, 在这里可以用两个vector类型容器,一个是q2存储所有节点值存为0的结点, 另一个q3存储节点值为1的结点. 那么如果q2不为空那么也就是有可以走零,那么就从这里面选,

POJ 3617 - Best Cow Line(字典序最小) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3617 洛谷题目链接:https://www.luogu.org/problem/show?pid=2870 题目大意: 给定一个长度为N(1<=N<=30000)的字母序列,每次可以从序列头部或尾部取出一个字母加入一个队列的尾部,求此队列字典序最小的排列. 每输出80个字母,换行一次. 分析: 每次比较序列首部和尾部,取出较小的一个,如果相等就继续往下比较,直

3532: [Sdoi2014]Lis 最小字典序最小割

3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status][Discuss] Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案.如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种. 这题难点在如何求一组最小字典序最小的最小