贪心习题B:拼数

不懂贪心思路的点这里:贪心算法是什么

                                                                        拼数

输入n个正整数,将它们拼接成一个最大的整数。

输入格式

第一行一个整数n。

接下来n行,每行一个整数

输出格式

输出一行,表示拼接后的最大整数。

样例输入 1

4
7
13
4
246

样例输出 1

7424613

样例输入 2

3
13
312
343

样例输出 2

34331213

提示

n≤10000,0≤每个数≤10^{18}

第一步:

        我们先看一下这个题可以用什么贪心策略

      第一个例子:

                我先随便出几个数:1、2、 3、4

                这几个数怎么完成拼数呢?

                答案显而易见:4321

                我们要从根本上去考虑,因为4>3>2>1

      第二个例子:

                那再出几个数:123,99,234

                因为它们:234>123>99

                所以应该这样排列吗?显然不是,答案肯定是99234123,而不是23412399

                这大约是4倍关系了呢!

                聪明的读者们肯定知道,这里其实是要比较首位,9>2>1,所以才是99234123啊!

                那么问题来了,为什么1、2、3、4可以直接比较大小呢,其实,读者也一定猜得出来

                因为1、2、3、4的首位就是他们本身啊!

       第三个例子:

                我们再出几个数:876,864,89,894

                读者可能就没有那么容易推出答案了吧,其实,答案是89894876864

                我们将它分开89,894,876,864,其中第3,4个读者肯定是可以确定的

                但为什么89在894前面呢?

                因为89894比89489大啊

                所以,贪心策略就呼之欲出了:排一个序把组合起来大的排在前面,输出就可以了

第二步:

        使用邻项交换法:

        如果我们把它的判断大小的函数左右互换,那么1、2、3、4就是1234,显然不对,那么我们的贪心策略是正确的

第三步:

        写代码,以下是本题AC代码:

#include<bits/stdc++.h>
#define MAX 10001
using namespace std;
bool cmp(string a,string b){
	return a+b>b+a;
}
int main()
{
	int n;
	string a[MAX];
	scanf("%d",&n); 
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a,a+n,cmp);
	for(int i=0;i<n;i++) cout<<a[i];
	return 0;
}

上一篇:贪心习题A:找零钱

下一篇:贪心习题C:排队打水

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值