CF888E - 最大余数[适合难度:普及+,提高-],知识点:折半枚举,二分查找

本文主要是介绍CF888E - 最大余数[适合难度:普及+,提高-],知识点:折半枚举,二分查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CF888E - 最大余数[适合难度:普及+,提高-],知识点:折半枚举,二分查找

子集就是某一个组合

暴力枚举所有组合的复杂度为 2 35 2^{35} 235,不可接受

所以用上了折半枚举。。。。。。

折半枚举 + 二分查找,时间复杂度不超过 2 18 2^{18} 218

折半枚举:

吧所有的数字拆成两半,暴力前一半数的所有组合,最多为 2 18 2^{18} 218

保存到 数组里进行排序。(预处理)

暴力枚举另外一半的所有组合。对于某一个组合的数,到 数组里面去配对,去二分查找一个数,跟X加起来 M O D M MOD M MODM最大,最后更新答案。

最终问题就变成了在一个有序的数组中查找某一个数,用二分解决。

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;vector <int> b;
vector <int> a;int tot;int find(int x)
{int best = -1;int l = 0, r = tot - 1;if(b[r] <= x){return b[r];}while(l <= r){int mid = (l + r) / 2;if(b[mid] <= x){best = b[mid];l = mid + 1;}else{r = mid - 1;}}return best;
}int main()
{int n, mod;scanf("%d%d", &n, &mod);int m = n / 2;for(int i = 0; i < n; i ++){int x;scanf("%d", &x);a.push_back(x % mod);}for(int i = 0; i < (1 << m); i ++){int tmp = 0;for(int j = 0; j < m; j ++){if(i & (1 << j)){tmp += a[j];tmp %= mod;}}b.push_back(tmp);}tot = b.size();sort(b.begin(), b.end());m = n - (n / 2);int mx = 0;for(int i = 0; i < (1 << m); i ++){int tmp = 0;for(int j = 0; j < m; j ++){if(i & (1 << j)){int jj = j + n / 2;tmp = (tmp + a[jj]) % mod;}}int x = find(mod - tmp - 1);mx = max(mx, (x + tmp) % mod);if(mx == mod - 1){break;}}printf("%d\n", mx);return 0;
}

这篇关于CF888E - 最大余数[适合难度:普及+,提高-],知识点:折半枚举,二分查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096015

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想