题目链接:点击查看

题目大意:给出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表+暴力)相关推荐

  1. HDU 3486 Interviewe RMQ

    题意: 将\(n\)个数分成\(m\)段相邻区间,每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\),从每段区间选一个最大值,要让所有的最大值之和 ...

  2. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  3. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  4. LCA RMQ+ST表学习笔记

    RMQ RMQ问题:在给定的一个长度位N的区间中,有M个询问,每次询问给出区间[L,R],求出区间段元素的 最大值/最小值.对于RMQ问题很容易想到遍历的做法,将区间[L,R]中的元素遍历一遍,即可寻 ...

  5. RMQ与SparseTable(ST表)

    静态区间最值问题(RMQ) ST表. #include <iostream> using namespace std;int N, Q; int D[(1<<17)][17]; ...

  6. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1567  Solved: 718 [Submit][Statu ...

  7. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...

    仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...

  8. 线性结构 —— ST 表与 RMQ

    [概述] RMQ(Range Minimum/Maximum Query),是对于长度为 n 的数列 A,回答若干次询问 RMQ(i,j),返回数列 A 中下标在区间 [i,j] 中的最值,即:区间最 ...

  9. 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

    目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...

最新文章

  1. 数据结构练习 00-自测1. 打印沙漏(20)
  2. C# 多线程读取数据并保存在DataGridView中,如果操作?代码是什么?谢谢
  3. easyui树拖拽排序java_easyui tree 拖拽功能并将数据返回后台保存至数据库
  4. 布尔运算_3dmax教程 - 布尔运算
  5. 客户关系管理(第3版) Customer Relationship Management,3 ...
  6. oracle procedure可以执行非常复杂的语句吗,oracle-存储过程(procedure)
  7. python中文文本分类
  8. eclipse下载与安装(汉化教程)超详细
  9. Python如何使用Continue语句?用法示例
  10. ios修改apn的插件_更改接入点,瞬间让你在4G网络下快到不行!效果立竿见影!...
  11. 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
  12. 如何增强大脑记忆力?提高大脑记忆能力的20个方法
  13. 75 道 JavaScript 面试题
  14. MySQL学习_数据库和表的基本操作
  15. 计算机图形学:3D坐标系及左右手坐标的转换
  16. 掌控习惯读后感-詹姆斯·克利尔(James Clear)
  17. 摄影几何基础知识(1)
  18. 【DOM】初识DOM
  19. [车联网安全自学篇] ATTACK安全之Frida反调试检测
  20. ets( )函数和自动预测

热门文章

  1. elastic-job配置类
  2. synchronized概念
  3. MyBatis 实际使用案例-Mapper.xml 映射配置文件【重点】
  4. 类文件结构-method-init和类文件结构-method-main
  5. 类文件结构-访问标识和继承信息
  6. RocketMQ错误消息重试策略之Consumer的重试机制(timeout情况)
  7. XMLIOC案例-编写spring的Ioc配置
  8. 访问数组元素进行赋值
  9. Nginx_反向代理配置讲解
  10. 在线做计算机考研题,2018年计算机考研真题及参考答案