蓝桥杯 18省赛 A9 倍数问题(倒序dfs)
标题:倍数问题
【题目描述】
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
【输入格式】
从标准输入读入数据。
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
【输出格式】
输出到标准输出。
输出一行一个整数代表所求的和。
【样例输入】
4 3
1 2 3 4
【样例输出】
9
【样例解释】
选择2、3、4。
【数据约定】
对于 30% 的数据,n <= 100。
对于 60% 的数据,n <= 1000。
对于另外 20% 的数据,K <= 10。
对于 100% 的数据,1 <= n <= 10^5, 1 <= K <= 10^3,给定的 n 个数均不超过 10^8。
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
==================
思路:
取最大值->从后往前穷举dfs
不确定输出是否正序,->Arrays.sort()快排一波
public class Main {
static int n ,k;
static int[] a;
public static void main(String[] args) {
init();
Arrays.sort(a);
dfs(a.length -1 ,0 ,0);
}
private static boolean dfs(int index ,int sum ,int lev) {
if(lev ==3) {if(sum *1.0 %k ==0) {System.out.println(sum); return true;} return false;}
for(int i =index ;i >=0 ;i --) if(dfs(i -1 ,sum +a[i] ,lev +1)) return true;
return false;
}
private static void init() {
Scanner sc = new Scanner(System.in);
n =sc.nextInt();
k =sc.nextInt();
a =new int[n];
for(int i =0 ;i <n ;i ++) a[i] =sc.nextInt();
sc.close();
}
}