原题链接:蓝桥杯2018年第九届真题-倍数问题
解题思路:
说明一下哪两个优化,首先我是先给数据从大到小排好序的,如果你在安排第二个数的时候你选择的第一个数还没有最大值的1/3大,你后面选择的两个数必定小于第一个数,因此不可能超过最大值,直接回溯,两个优化都是这个思想。
注意事项:
参考代码:
#include#includeusing namespace std; int a[100010]; int n,k; bool vis[100010]; int cnt; void dfs(int x,int sum){ if(x>=4){ if(sum%k==0) cnt = max(cnt,sum); return; } if(x==3&&sum<cnt*2/3) //优化前36 优化后66 相当于减去挑选第二个数时很小的情况 return; if(x==2&&sum=0;i--){ if(!vis[i]){ vis[i] = true; dfs(x+1,sum+a[i]); vis[i] = false; } } } int main(){ cin>>n>>k; for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); dfs(1,0); cout<<cnt; return 0; }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复