HDU - 3486 Interviewe(RMQ-st表+暴力)
题目链接:点击查看
题目大意:给出n个点代表n个面试者,每个点的点权代表每个面试者的能力值,现在老板要求将n个人分成m组,每组有n/m个人,多出来的余数的那些人舍弃掉了,现在要让这m个组中的最大值相加,这个sum和需要满足一个阈值k,现在求满足上述条件的情况下,m的最小值是多少,也就是最少需要分多少个组
题目分析:首先这个题需要先判断一下能否满足条件,在输入的时候维护一个sum和记录一下所有人的能力之和,若sum比阈值k还小,那肯定是无法满足条件的,直接输出-1结束,若能满足条件我们再枚举m,因为实在没有什么更好的办法了,在枚举m之前我们可以剪个枝,直接从1开始枚举肯定是不合理的,我们先找一下n个人能力值中的最大值mmax,假设现在分成的m个组中,每个组的最大值都是这个mmax,那么最少也需要分成k/mmax个组,这样一来比直接从1开始枚举就减少了很多时间了,外层循环确定好组数后,内层循环确定一下每个组有多少个人,然后按照题意查询每个组的最大值然后相加即可,注意一下,若想找每个组的最大值,暴力找肯定会T,我有想过用线段树,但这毕竟是一个静态最值查询,而且给出的空间也足够,所以可以直接上st表了,用在这里再合适不过了,配合上st表+暴力枚举,就能把这个题拿下了
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;int n,k;int st[N][20],a[N];void get_st()
{for(int i=1;i<=n;i++)st[i][0]=a[i];for(int i=1;i<=log2(n);i++)for(int j=1;j+(1<<i)-1<=n;j++)st[j][i]=max(st[j][i-1],st[j+(1<<i-1)][i-1]);
}int query(int l,int r)
{int k=log2(r-l+1);return max(st[l][k],st[r-(1<<k)+1][k]);
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);while(scanf("%d%d",&n,&k)!=EOF&&n!=-1){int sum=0;for(int i=1;i<=n;i++){scanf("%d",a+i);sum+=a[i];}if(sum<k){printf("-1\n");continue;}get_st();int mmax=*max_element(a+1,a+1+n);for(int i=k<mmax?1:k/mmax;;i++)//枚举组数 {int num=n/i;//每组的人数int sum=0;for(int j=0;j<i;j++)sum+=query(j*num+1,(j+1)*num); if(sum>k){printf("%d\n",i);break;}}}return 0;
}
HDU - 3486 Interviewe(RMQ-st表+暴力)相关推荐
- HDU 3486 Interviewe RMQ
题意: 将\(n\)个数分成\(m\)段相邻区间,每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\),从每段区间选一个最大值,要让所有的最大值之和 ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- LCA RMQ+ST表学习笔记
RMQ RMQ问题:在给定的一个长度位N的区间中,有M个询问,每次询问给出区间[L,R],求出区间段元素的 最大值/最小值.对于RMQ问题很容易想到遍历的做法,将区间[L,R]中的元素遍历一遍,即可寻 ...
- RMQ与SparseTable(ST表)
静态区间最值问题(RMQ) ST表. #include <iostream> using namespace std;int N, Q; int D[(1<<17)][17]; ...
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1567 Solved: 718 [Submit][Statu ...
- luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...
仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...
- 线性结构 —— ST 表与 RMQ
[概述] RMQ(Range Minimum/Maximum Query),是对于长度为 n 的数列 A,回答若干次询问 RMQ(i,j),返回数列 A 中下标在区间 [i,j] 中的最值,即:区间最 ...
- 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)
目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...
最新文章
- 数据结构练习 00-自测1. 打印沙漏(20)
- C# 多线程读取数据并保存在DataGridView中,如果操作?代码是什么?谢谢
- easyui树拖拽排序java_easyui tree 拖拽功能并将数据返回后台保存至数据库
- 布尔运算_3dmax教程 - 布尔运算
- 客户关系管理(第3版) Customer Relationship Management,3 ...
- oracle procedure可以执行非常复杂的语句吗,oracle-存储过程(procedure)
- python中文文本分类
- eclipse下载与安装(汉化教程)超详细
- Python如何使用Continue语句?用法示例
- ios修改apn的插件_更改接入点,瞬间让你在4G网络下快到不行!效果立竿见影!...
- 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
- 如何增强大脑记忆力?提高大脑记忆能力的20个方法
- 75 道 JavaScript 面试题
- MySQL学习_数据库和表的基本操作
- 计算机图形学:3D坐标系及左右手坐标的转换
- 掌控习惯读后感-詹姆斯·克利尔(James Clear)
- 摄影几何基础知识(1)
- 【DOM】初识DOM
- [车联网安全自学篇] ATTACK安全之Frida反调试检测
- ets( )函数和自动预测