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

相关文章

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

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.实现接