题目

要做就做第一名。

小R有 N 个整数 wi,小J发明了一种离子炮,能够将小R的每个整数按位轰成独立的多个数字。

小R花了很多时间将所有的独立数字按照其原本所归属的整数分为了 N 堆,小J给他出了一个难题,如果小R能够从每一堆中选择 K 个数字构成 N 个新整数(若不足 K 个则用 0 补齐),并且按照某种方式将这 N 个新整数首尾拼接起来,得到一个他能得到的最大值,小J就将把离子炮借给小R玩。

小R对此非常兴奋,他想用离子炮也轰碎小J的所有整数,希望你能够来帮助他一起完成这个任务,他想知道从每堆数字中选择哪些数字构建新整数后再用怎样的顺序拼接起来能得到最大值,但他并不关心具体实现过程,他想要你直接告诉他最后拼接起来后的最大值。

输入:第一行是两个正整数 N, K;接下来 N 行,每行一个整数表示待处理数据 wi
输出:一行一个整数,表示构建的最大值。

样例1:

输入

1 5
6549513

输出

96554

样例2:

输入

5 3
4567894
1234855
4549946
4548676
9654534

输出

996987965876855

解释:从每个数字中依次选择并构建得到 987、855、996、876、965,最终组合得到最大值。

提示:对于 30% 的数据,保证 N=1,wi≤109。对于 60% 的数据,保证 N≤20,wi≤1018。对于 100% 的数据,保证 N≤10000,wi≤10100,K≤100。

思路

C++ · p64.cpp

复杂度分析

  • 时间复杂度:
  • 空间复杂度:
今日感受

← 返回菜鸟的coding