多多君最近在研究某种数字组合:
定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。
数据范围: 1≤n≤1000 1≤n≤1000
输入描述:
共一行,一个正整数N,如题意所示,表示组合中数字不同数位之和。 (1 <= N <= 1,000)
输出描述:
共一行,一个整数,表示该组合中的最小值。 如果组合中没有任何符合条件的数字,那么输出-1即可。
示例1
输入例子:
5
输出例子:
5
例子说明:
符合条件的数字有:5,14,23,32,41
其中最小值为5
示例2
输入例子:
12
输出例子:
39
示例3
输入例子:
50
输出例子:
-1
例子说明:
没有符合条件的数字 (T▽T)
思路:
1. 由于每个数位的数字不同,因此能表示的N最大为 45(1+2+...+9)。
2. 使用贪心算法可以解决,策略如下:从个位开始尽可能的放置较大的数字进行填充。
JAVA 代码实现如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int ans = 0, max = 9, level = 1;
if (num > 45) {
System.out.println(-1);
} else {
while (num > 0) {
if (num > max) {
ans += max * level;
level *= 10;
} else {
ans += num * level;
}
num -= max --; // N减掉当前数位填充的值,数位值依次递减
}
System.out.println(ans);
}
}
}