【DFS】(2018)第九届蓝桥杯省赛 C/C++ A组(第九题)

时间:2022-09-10 09:35:52

第九题 

题目

标题:倍数问题

【题目描述】
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 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

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。


思路

  简单的DFS深搜一下就可以。

测试结果

  【DFS】(2018)第九届蓝桥杯省赛 C/C++ A组(第九题)【DFS】(2018)第九届蓝桥杯省赛 C/C++ A组(第九题)【DFS】(2018)第九届蓝桥杯省赛 C/C++ A组(第九题)

代码

#include <iostream>
#include<cstring> 
#include<cstdio> 
#include<vector>
using namespace std;
const long long nmax=1e5;
long long nn,k;
//long long ans[nmax];
long long vis[nmax];
long long tmp[nmax];
long long num[nmax];
vector<long long>vc;
long long max(long long a,long long b){
	return a>b?a:b;
}

long long dfs(long long n){//层数从0开始 
	if(n>=3){
		long long t=tmp[0]+tmp[1]+tmp[2];
		if(t%k==0){
			//printf("%lld\n",t);
			vc.push_back(t);
		}
	}
	else{
		for(long long i=0;i<nn;i++){
			if(vis[i]==0){
				tmp[n]=num[i];
				vis[i]=1;
				dfs(n+1);
				vis[i]=0;
			}
		}
		 
	}
}
int main(int argc, char** argv) {
	scanf("%lld%lld",&nn,&k);
	
	memset(vis,0,sizeof(vis));
	memset(num,0,sizeof(num));
	memset(tmp,0,sizeof(tmp));
	for(long long i=0;i<nn;i++){
		scanf("%lld",&num[i]);
	}
	dfs(0);	
	long long ans=0;
    for(long long i=0;i<vc.size();i++){
    	ans=max(ans,vc[i]);
	}
	printf("%lld\n",ans);
	return 0;
}