最大数字
题目分析
我要求经过一系列操作后可以得到的最大数字,每个操作都有次数限制,我们依次去看这些操作哈,
操作1:假设对于每一位我是从最高位依次向最低位遍历的,对某一位加1,那么加都加了,我们希望把这一位加到最大值也就是9,但是也有可能加不到9,因为我的操作有次数限制,所以就是在9和n之间选一个最小值,那么就是加法的操作次数,如下代码,c表示当前这一位的值,t就是对于当前位来说我能够加的次数,那么n就是可以加的总次数,经过此次操作后,加的总次数要减掉t。j表示前step-1位得到的值,那么遍历完这一位之后,前step位得到的值就是j*10+c+t。
private static void dfs(int step, long j) {
......
int t = Math.min(n, 9 - c);//尽可能的加到9,但是还要考虑我的n可能次数不够了
n -= t;//减去加操作使用的次数
dfs(step+1, j*10+c+t);
n +=t;//回溯,要复原
......
}
操作2:假设对于每一位我是从最高位依次向最低位遍历的,对某一位减1,那么我要么给他减到9,要么一点都别减。所有只有当我确定我可以减到9时,我才执行减操作。
//减操作,判断是否可以进行,不可以就一步不可进行
if(m > c) {
m -= c+1;
dfs(step+1, j*10+9);
//回溯
m += c+1;
}
当遍历到最后一位时,此时获得的数字的值就确定了,那么我就拿它和我之间记录的答案比较,取一个最大值就可以了。
if(step==a.length()) {
ans = Math.max(ans, j);
return;
}
这里我用字符串存的数字,目的是我可以快速的得到某一位上的值。全部代码如下,
题目代码
import java.util.Scanner;
public class Main {
static long ans = 0;
static String a;
static int n;
static int m;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
a = scanner.next();
n = scanner.nextInt();
m = scanner.nextInt();
dfs(0,0);
System.out.println(ans);
}
private static void dfs(int step, long j) {
// TODO Auto-generated method stub
if(step==a.length()) {
ans = Math.max(ans, j);
return;
}
int c = a.charAt(step)-'0';
//加操作
int t = Math.min(n, 9 - c);//尽可能的加到9,但是还要考虑我的n可能次数不够了
n -= t;//减去加操作使用的次数
dfs(step+1, j*10+c+t);
//回溯时,不要忘记复原n
n += t;
//减操作,判断是否可以进行,不可以就一步不可进行
if(m > c) {
m -= c+1;
dfs(step+1, j*10+9);
//回溯
m += c+1;
}
}
}