贪心之最大整数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37220238/article/details/80001034
描述

设有n(n≤20)个正整数(每个在int范围内),将它们连接成一排,组成一个最大的多位整数。例如n=3,3个整数分别是13、312和343,连接成最大的整数为34331213。

输入第一行1个整数n
第二行为n个正整数,分别用空格分隔输出一行,一个数,表示连接成的最大整数。样例输入
4
7 13 4 246
样例输出
7424613
提示贪心解题思路

    使用贪心思想,首先把每两个数进行一次组合,把组合过后较大的那个结果的前面那个数排在前面,后面的那个数排在后面;以此类推之后,最后就能得出n个数组合的最大值。

我使用了两种方法来做:

    第一种方法是使用结构体来存放输入数字的大小和长度,类型都是整形,但是两个整形的数组合起来教委麻烦,比如说两个整数a和b,长度分别为lena和lenb,组合数为a*10^lenb+b和b*10^lena+a,比较这两个数的大小,比较麻烦;

    第二种方法我使用字符串来存放输入的数字,字符串组合就比较简单了,同样两个数字a和b,不用考虑两个字符串的长度,字符串组合直接使用加符号,所以组合数为a+b和b+a,比较大小也可以直接比较(return a+b>b+a?a+b:b+a),是不是比整形方法的简单多了?

参考程序1
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct num
{
	long long x,y;//x表示这个数字,y表示这个数字的长度
}v[25];
int comp(num a,num b)
{
	return a.x*pow(10,b.y)+b.x>b.x*pow(10,a.y)+a.x;//每两个数进行组合,找出最大的数字排列顺序 
}
int main()
{
	int n,t,c=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>v[i].x;
		t=v[i].x;
		c=0;
		while(t)//计算这个数字的长度
		{
			c++;
			t/=10;
		}
		v[i].y=c;
	}
	sort(v+1,v+1+n,comp);
	for(int i=1;i<=n;i++)
		cout<<v[i].x;
	return 0;
}
参考程序2
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(string a,string b)//定义字符串排序
{
    if(a+b>b+a)return 1;
    else return 0;
}
int main()
{
	int n;
	string a[25];
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)
		cout<<a[i];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37220238/article/details/80001034