编程算法 - 最好牛线(Best Cow Line) 代码(C)

最好牛线(Best Cow Line) 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 给定长度为N的字符串S, 要构造一个长度为N的字符串T. 反复进行如下任意操作.

从S的头部删除一个字符, 放入T的尾部;

从S的尾部删除一个字符, 放入T的尾部;

目标是要构造字典序尽可能小的字符串T.

使用贪心算法, 不断选取S首尾最小的字符, 放入T, 如果相等, 则再次向内查找, 找到内部最小的.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.17
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <limits.h>

#include <utility>
#include <queue>
#include <algorithm>

using namespace std;

class Program {
	static const int MAX_N = 10000;
	int N = 6;
	char S[MAX_N+1] = "ACDBCB";
public:
	void solve() {
		int a=0, 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;
				} else if (S[a+i] > S[b-i]) {
					left = false;
					break;
				}
			}

			if (left) putchar(S[a++]);
			else putchar(S[b--]);
		}
		putchar(‘\n‘);
	}
};

int main(void)
{
	Program P;
	P.solve();
    return 0;
}

输出:

ABCBCD

编程算法 - 最好牛线(Best Cow Line) 代码(C),布布扣,bubuko.com

时间: 2024-10-22 17:59:31

编程算法 - 最好牛线(Best Cow Line) 代码(C)的相关文章

[Luogu2870] [USACO07DEC]最佳牛线Best Cow Line(贪心+后缀数组)

[Luogu2870] [USACO07DEC]最佳牛线Best Cow Line(贪心+后缀数组) 题面 FJ打算带他的\(N(1 \leq N \leq 30,000)\)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首字母取出,按它们对应奶牛在队伍中的次序排成一列(比如说,如果FJ带去的奶牛依次为Bessie.Sylv

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

编程算法 - 最小的k个数 红黑树 代码(C++)

最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用红黑树(multiset), 每次替换最大的值, 依次迭代. 时间复杂度: O(nlogk). 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <iostream> #include <vector> #includ

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

编程算法 - 不能被继承的类(私有构造函数) 代码(C++)

不能被继承的类(私有构造函数) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 用C++设计一个不能被继承的类. 可以使用私有构造函数, 并提供静态成员函数, 返回和删除类的实例. 则只能在堆上创建实例, 不能在栈上创建. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list> us

编程算法 - n个骰子的点数(递归) 代码(C)

n个骰子的点数(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把n个骰子仍在地上, 所有骰子朝上一面的点数之和为s. 输入n, 打印出s的所有可能的值出现的概率. 采用递归的方法, 可以假设只有一个骰子, 然后骰子数递增相加. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include <stdlib.

编程算法 - 计算一个数的所有组合数 代码(C++)

计算一个数的所有组合数 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 计算一个数的组合数, 使用递归进行求解. 如果计算3位的组合数, 首先任选固定一位, 然后计算其余两位的组合数, 最后组合至一起. 如 1 + [23, 32] = 123, 132; 在固定其余位数, 如 2 + [13, 31] = 213, 231;  3 + [12, 21] = 312, 321; 程序分为两步分, 一个删除任意位置的一个元素, 一个是递归求解组合

编程算法 - 求1+2+...+n(函数继承) 代码(C++)

求1+2+...+n(函数继承) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用函数继承, 通过递归调用, 每次递归值减1, 使用求反运算(!), 即非0为0, 0为1. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spik

编程算法 - 求1+2+...+n(函数指针) 代码(C++)

求1+2+...+n(函数指针) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用函数指针求解, 通过递归调用, 每次递归值减1, 使用求反运算(!), 即非0为0, 0为1. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: sp