【贪心算法】最大整数

题目:

设有n个正整数,将它们连接成一排,组成一个最大的多位整数。

例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。

又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。

输入:

n

输入n个数。

输出:

连成的多位数。

思路:

让这几个数排排序连接成最大的整数,所以应考虑,各个整数顺序,那么对这几个整数排序的准则是什么?

准则:设两个整数是a,b,如果a+b大于b+a,那么a在b的前面,反之,b在a前面也就是局部的解

全局的解就是所有整数的连接顺序,既然要用到连接所以用string。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;
string str[3] = {""};

string GetStrFromInt(int n)
{
stringstream ss;
string s;
ss << n;
ss >> s;
return s;
}

string GreedyAlgorithm(int n)
{
int arr[4] = { 0 };
string strmax = "";
cout << "Please Input the Data:" << endl;
int m = n;
while (m--)
{
if (!(cin >> arr[m]))
{
cout << "输入数据不合法" << endl;
return NULL;
}
}

//核心算法———将整数转为字符串,连接起来进行比较
for (int i = 0; i < n; ++i)
{
str[i] = GetStrFromInt(arr[i]);
}

for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if ((str[i]+str[j]).compare(str[j] + str[i]) < 0)
{
string temp=str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
for (int i = 0; i < n; ++i)
{
strmax += str[i];
}
return strmax;
}

int main()
{
int n;
cout << "Please Input Datas:" << endl;
if (cin >> n)
cout << GreedyAlgorithm(n) << endl;
else
cout << "输入数据不合法" << endl;
return 0;
}

C++知识点总结:

①将整数转成字符串:需要头文件#include <sstream>具体代码如下:

string GetStrFromInt(int n)
{
stringstream ss;
string s;
ss << n;
ss >> s;
return s;
}

②字符串连接:string 类型的变量可以直接用“+”,“+=”连接。

③字符串比较:

string 字符串可以直接用"<",">"直接比较。

int strcmp(const char firststring[], const char secondstring);(字符逐个比较)

时间: 2024-10-21 00:03:26

【贪心算法】最大整数的相关文章

贪心算法的简述与示例

贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯.能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质. 参考:http://babybandf.blog.163.com/blog/static/61993532010112923767/ [例1]删数问题[B][/B] 试题描

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

贪心算法(发工资)

发工资咯:) Problem : 430 Time Limit : 1000ms Memory Limit : 65536K description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢? 这里假设老师的工资都是正整数,单位元,人民币一共有100

贪心算法-跳跃游戏二

给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 你的目标是到达最后一个下标,并且使用最少的跳跃次数. 例如: A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2.(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标.一共两次) 输入格式 第一行输入一个正整数 n(1≤n≤100) ,接下来的一行,输入 n 个整数,表示数组 A. 输出格式 最后输出最少的跳跃次数. 样例输入 5 3 1 1 1 1

贪心算法练习:乘船问题

/*-------------------------------------------------------------- 有n个人,第i个的重量为wi,每艘船的最大载重为c, 而且最多只能乘两个人.用最少的船装载所有人. 输入: 第一行两个整数n和c 第二行n个整数,分别是wi 输出: 第一行输出使用船的数量num 第二行到第n+1行每行输出两个数, 分别“人的编号”以及他所乘坐的“船的编号”. 人的编号按输入的顺序从1到n编号.船的编号从1开始编号. 第2行到第n+1行按人的编号从小到

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

hduoj-1735 简单的贪心算法

字数统计 Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1987    Accepted Submission(s): 552 Problem Description 一天,淘气的Tom不小心将水泼到了他哥哥Jerry刚完成的作文上.原本崭新的作文纸顿时变得皱巴巴的,更糟糕的是由于水的关系,许多字都看不清了.可怜的Tom知道他闯下大祸了

贪心算法讲解及例题

修改自:http://blog.csdn.net/a925907195/article/details/41314549 一.概念: 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 二.贪心算法的基本思

贪心算法选择不相交区间

Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示.n=0表示输入结束,不做处理. Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行. Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8