[贪心] [COGS1025] 数字积木

来源:互联网 发布:百货批发软件哪个好 编辑:程序博客网 时间:2024/06/11 15:05

题目描述 Description

小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢?
你的任务就是读入n个数字积木,求出所能形成的最大数。

输入 Input

输入文件brick.in共N+1行。
第一行是一个整数n,接下来n行每行是一个正整数

输出 Output

输出文件brick.out共一行。
第一行一个整数,为所能形成的最大整数。

样例输入 Sample Input

3
13
131
343

样例输出 Sample Output

34313131

限制 Limits

对于30%的数据,n10,每个数103
对于50%的数据,n100
对于100%的数据,n1000,每个数10200

23333333第一眼看好诡异的题……
选择贪心思想,因为这几个块组成的数位数是确定的,要组成的数尽可能大,就要使越靠前的数尽可能大。
但是怎么使靠前的数尽可能大?显然根据样例单纯判断数字大小不可取。
样例中:13<131,而13要放在131前面……
于是,考虑两个串ab应该如何放入答案……
ab组合只有两种方式,a+bb+a,那么就可以按a+b>b+a排序,得到的排序后序列即为最优解。
上代码……

#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n;string a[1010];bool cmp(string a,string b){    return a+b>b+a;}int main(){    cin>>n;    for (int i=1;i<=n;i++) cin>>a[i];    sort(a+1,a+n+1,cmp);    for (int i=1;i<=n;i++) cout<<a[i];    return 0;}
0 0
原创粉丝点击