首页 > 其他分享 >折半搜索

折半搜索

时间:2024-09-27 20:50:01浏览次数:8  
标签:折半 int ans1 ans2 搜索 答案 ans sum

标题:正如标题所示

当n=35时。爆搜的复杂度是$O(2^n)$,肯定是不能接受的,这时候就可以用折半搜索了。
折半搜索的思想是:先搜一半数据的答案,在搜另一半数据的答案,最后合并这两个答案,得到最终的答案。
例如此题:Maximum Subsequence
可以先爆搜搜出前半段的答案,再搜出后半段的答案,得到两个序列$ans1,ans2$, 设最终的答案是$ans$
对$ans1,ans2$进行排序,现在要做的就是把两个序列中取两个数,让他们加起来摸m的值最大即可,这要利用双指针。
对于一个$ans1中的i$来说,$ans2序列可以分为两个部分:1.ans1[i]+ans2[j]>=m,2.ans1[i]+ans2[j]<m$那么谁会贡献答案呢?
对于1来说,每个j都可能贡献答案,对于2来说,只有最大的那一个才会贡献答案。
当i++时,j不需要从头再来,(下次再说)
code:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m, k;
int a[100], ans;
vector<int> ans1, ans2;

void dfs1(int i, int sum) {
	if(i == k + 1) {
		ans1.push_back(sum);
		return;
	}
	dfs1(i + 1, sum);
	dfs1(i + 1, (sum + a[i]) % m);
}

void dfs2(int i, int sum) {
	if(i == n + 1) {
		ans2.push_back(sum);
		return;
	}
	dfs2(i + 1, sum);
	dfs2(i + 1, (sum + a[i]) % m);
}

int main() {
	
	cin >> n >> m;
	for(int i = 1 ; i <= n ; i ++) {
		cin >> a[i];
		a[i] %= m;
	}
	k = n / 2;
	dfs1(1, 0);
	dfs2(k + 1, 0);
	int l1 = ans1.size(), l2 = ans2.size();
	sort(ans1.begin(), ans1.end());
	sort(ans2.begin(), ans2.end());
	int j = l2 - 1;
	for(int i = 0 ; i < l1 ; i ++) {
		while(j >= 0 && ans1[i] + ans2[j] >= m) {
			ans = max(ans, (ans1[i] + ans2[j]) % m);
			j --;
		}
		if(j < 0) break;
		ans = max(ans, ans1[i] + ans2[j]);
	}
	cout << ans;
	
}

完结

标签:折半,int,ans1,ans2,搜索,答案,ans,sum
From: https://www.cnblogs.com/lghjl/p/18436510

相关文章

  • pbootcms获取结果页面的搜索keyword值和tag值
    在PbootCMS中,如果你想获取结果页面(比如文章列表或详情页面)的搜索关键词(keyword)和标签(tag)值,可以通过查询字符串(URL参数)或者从系统全局变量中取得。具体方法如下:获取搜索关键词(Keyword)当用户通过搜索引擎进行搜索时,搜索关键词通常会作为URL的一部分传递。例如,一个典型的搜索URL可......
  • python在word文档中搜索关键词,复制段落
    目录简介:打开原始word文档创建一个新的文档(存放摘抄内容)搜索关键词复制和粘贴匹配的段落简介:本文示例的流程:打开一个word文档,搜索关键词所在的段落,并将对应段落复制粘贴到新的word文档中,并标记出处文件名和页码。可以用来批量对word文档进行提取。打开原始word文......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档回复:20240926<12019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带如果......
  • 平衡二叉搜索树
    PART0:引子二叉树想必大家都很熟悉,它在编程中具有很广泛的应用,而二叉树又分为很多种,这里介绍的了两种二叉树和一种他们的结合体。PART1:二叉搜索树二叉搜索树的定义二叉搜索树要求任意一个节点的左子节点小于它,右子节点大于它。如图在二叉搜索树上查找的时间复杂度相比线性......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档公众号回复关键字:2024092612019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带......
  • 搜索技术汇总
    搜索效率谷歌>公众号>短视频>百度Google搜索指令B站讲解最详细的GOOGLE搜索指令大全谷歌搜索技巧大全|谷歌高级搜索语法指令(上)谷歌搜索技巧大全|谷歌高级搜索语法指令(下)关键词搜索("")在想要搜索的内容上加上英文双引号"",关键词信息完整出现,搜索结果更加精准。......
  • [Python手撕]判断二叉搜索树
    #Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defisValidBST(self,root:Optional[TreeNod......
  • 2024.9.25 Python,单词替换,优美的排列 II,sort的用法前K个高频单词,广度优先搜索腐烂的橘
    1.单词替换在英语中,我们有一个叫做词根(root)的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为衍生词(derivative)。例如,词根help,跟随着继承词“ful”,可以形成新的单词“helpful”。现在,给定一个由许多词根组成的词典dictionary和......
  • uniapp - 详解安卓App打包后使用uni.chooseLocation地址列表一直加载转圈问题,Android
    前言网上的教程都无法解决问题,本文提供强力解决方案。在uni-app安卓App平台端开发中,详解uniApp打包成Android安卓后用chooseLocation打开地图选择位置空白卡住不动问题,选择地址列表什么也没有且一直处于加载状态(永远不会加载出来卡住了),另外点击搜索框后也无法搜索地点......
  • BST-二叉搜索树
    g#前言从图的角度出发,树是一种特殊的图。图的大多数算法,树都可以适用。对树操作中,你可以发现有关图算法思想的体现。不过,本篇不是完全从图的角度解读树,重点在初学者视角(一般学习数据结构顺序是从树开始的,包括笔者也是如此,但是笔者后续学习离散数学和图的算法回顾树......