蓝桥杯 18省赛 A9 倍数问题(倒序dfs)

蓝桥杯 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();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43638238/article/details/107917934