UVA 10905 Children's Game 孩子的游戏 贪心

题意:给出N个数,要求把它们拼凑起来,让得到的数值是最大的。

只要分别比较两个数放前与放后的值的大小,排序后输出就可以了。

比如123和56,就比较12356和56123的大小就行了。

写一个比较函数,然后用sort调用就行了。

刚开始时用long long做,每次比较都让数相连,然后比较大小,后来发现数据好像会很暴力,即使longlong也不够大。

考虑到两个数相连后两种情况长度都一样,所以只要把数值当成string来做就行了,比较两个string的字典序大小。

代码:

 

 /*

 *   Author:        illuz <[email protected]>

 *   Blog:          http://blog.csdn.net/hcbbt

 *   File:          uva10905.cpp

 *   Lauguage:      C/C++

 *   Create Date:   2013-08-25 09:24:23

 *   Descripton:    UVA 10905 Children's Game, greed

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <iostream>

#include <list>

#include <vector>

#include <map>

#include <set>

#include <deque>

#include <queue>

#include <stack>

#include <utility>

#include <algorithm>

using namespace std;

#define rep(i, n) for (int i = 0; i < (n); i++)

#define repu(i, a, b) for (int i = (a); i < (b); i++)

#define repf(i, a, b) for (int i = (a); i <= (b); i++)

#define repd(i, a, b) for (int i = (a); i >= (b); i--)

#define swap(a, b) {int t = a; a = b; b = t;}

#define mc(a) memset(a, 0, sizeof(a))

#define ms(a, i) memset(a, i, sizeof(a))

#define sqr(x) ((x) * (x))

#define FI(i, x) for (typeof((x).begin()) i = (x).begin(); i != (x).end(); i++)

typedef long long LL;

typedef unsigned long long ULL;



/****** TEMPLATE ENDS ******/



const int MAXN = 55;

int n;

string num[MAXN];



bool cmp(const string& a, const string& b) {

	return a + b > b + a;

}



int main() {

	while (scanf("%d", &n) && n) {

		rep(i, n) cin >> num[i];

		sort(num, num + n, cmp);

		rep(i, n) cout << num[i];

		cout << endl;

	}

	return 0;

}


 

 

你可能感兴趣的:(children)