不懂贪心思路的点这里:贪心算法是什么
拼数
输入n个正整数,将它们拼接成一个最大的整数。
输入格式
第一行一个整数n。
接下来n行,每行一个整数
输出格式
输出一行,表示拼接后的最大整数。
样例输入 1
4
7
13
4
246
样例输出 1
7424613
样例输入 2
3
13
312
343
样例输出 2
34331213
提示
n≤10000,0≤每个数≤。
第一步:
我们先看一下这个题可以用什么贪心策略:
第一个例子:
我先随便出几个数: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:排队打水