hdu 3486 Interviewe (RMQ+二分)
Interviewe
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4543 Accepted Submission(s): 1108
YaoYao decides to make the interview as follows. First he queues the interviewees according to their coming order. Then he cuts the queue into m segments. The length of each segment is
, which means he ignores the rest interviewees (poor guys because they comes late). Then, each segment is assigned to an interviewer and the interviewer chooses the best one from them as the employee.YaoYao’s idea seems to be wonderful, but he meets another problem. He values the ability of the ith arrived interviewee as a number from 0 to 1000. Of course, the better one is, the higher ability value one has. He wants his employees good enough, so the sum of the ability values of his employees must exceed his target k (exceed means strictly large than). On the other hand, he wants to employ as less people as possible because of the high salary nowadays. Could you help him to find the smallest m?
In the first line of each case, there are two numbers n and k, indicating the number of the original people and the sum of the ability values of employees YaoYao wants to hire (n≤200000, k≤1000000000). In the second line, there are n numbers v1, v2, …, vn (each number is between 0 and 1000), indicating the ability value of each arrived interviewee respectively.
The input ends up with two negative numbers, which should not be processed as a case.
We need 3 interviewers to help YaoYao. The first one interviews people from 1 to 3, the second interviews people from 4 to 6,
and the third interviews people from 7 to 9. And the people left will be ignored. And the total value you can get is 100+101+100=301>300.
题意:
给出n个数,分成m段,每段取一个最大的,问m最小为多少时每段取到的最大的数的和大于K。
RMQ+二分:
时间卡很紧,800+ms C++飘过。
这题有个trap,坑了我很久的trap。
RMQ+二分其实很快就写好了,问题是卡在数据上,先看看数据
11 300
7 100 7 101 100 100 9 100 100 110 110
10 1500
1 1 1 1 1000 1000 1 1 1 1
8 201
100 100 100 100 101 100 100 100
很明显第一组数据输出的是3,题目有解释。
到第二组数据呢?本来应该输出2才合理,可是运行结果却是输出了6.
第三组也是输出2才合理,可结果是输出了3。
个人觉得是数据有点问题,题目也有点问题,其实这题用二分过不了才对,因为看第二组和第三组数据可知,数据其实没有单调性。
贴一下代码:
//781MS 16708K 1338 B C++
#include<stdio.h>
#include<math.h>
#define N 200005
int v[N];
int dp[N][];
inline int Max(int a,int b)
{
return a>b?a:b;
}
void init(int n)
{
for(int i=;i<=n;i++)
dp[i][]=v[i];
for(int j=;j<;j++)
for(int i=;i+(<<j)-<=n;i++)
dp[i][j]=Max(dp[i][j-],dp[i+(<<(j-))][j-]);
}
inline int RMQ(int l,int r)
{
int m=(int)(log(1.0*(r-l+))/log(2.0));
return Max(dp[l][m],dp[r-(<<m)+][m]);
}
inline int getsum(int m,int mm)
{
int sum=;
for(int i=;i+mm-<=m*mm;i+=mm)
sum+=RMQ(i,i+mm-);
return sum;
}
int main(void)
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n< || k<) break;
int sum=;
int maxn=;
for(int i=;i<=n;i++){
scanf("%d",&v[i]);
sum+=v[i];
maxn=Max(maxn,v[i]);
}
if(sum<=k){
puts("-1");continue;
}
if(maxn>k){
puts("");continue;
}
init(n);
int l=,r=n,mid;
while(l!=r){
mid=(l+r)/;
int ans=getsum(mid,n/mid);
printf("*%d %d\n",mid,ans);
if(ans<=k) l=mid+;
else r=mid;
}
printf("%d\n",l);
}
return ;
}
/* 11 300
7 100 7 101 100 100 9 100 100 110 110 10 1500
1 1 1 1 1000 1000 1 1 1 1 8 201
100 100 100 100 101 100 100 100 */
hdu 3486 Interviewe (RMQ+二分)的更多相关文章
- HDU 3486 Interviewe RMQ
题意: 将\(n\)个数分成\(m\)段相邻区间,每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\),从每段区间选一个最大值,要让所有的最大值之和 ...
- hdu 3484 Interviewe RMQ+二分
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; + ...
- HDU 5726 GCD (RMQ + 二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...
- HDU 3486 Interviewe
题目大意:给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之.现在让我们找最小的k使得和严格大于m. 题解:二分k,然后求RMQ检验. S ...
- HDU - 5289 Assignment (RMQ+二分)(单调队列)
题目链接: Assignment 题意: 给出一个数列,问其中存在多少连续子序列,使得子序列的最大值-最小值<k. 题解: RMQ先处理出每个区间的最大值和最小值(复杂度为:n×logn),相 ...
- 3486 ( Interviewe )RMQ
Problem Description YaoYao has a company and he wants to employ m people recently. Since his company ...
- Interviewe HDU - 3486 (ST表+枚举 )(非二分,看下这个数据、)
YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there ...
- hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 ...
- HDU 5089 Assignment(rmq+二分 或 单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
随机推荐
- C#下载局域网共享文件夹中的文件
在公司的局域网内部,有个主机,共享了几个文件夹给下面的客户机使用. 想要利用这个文件夹上传最新的winform程序版本,每次运行exe的时候检测局域网的软件版本达到更新exe的目的. 这里有个例子,是 ...
- 【解决】MongoDB 线上业务处理,数据去重脚本实现
mongo客户端工具下载 https://robomongo.org/download 线上业务,k线 展示出现问题,相同时间戳的数据多次插入导致数据不真实,后经排查发现是每次都是写的四条数据, ...
- 编程 - Python - 框架 - Django
一.Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了. 1. web框架介绍 具体介绍Django之前,必须先介绍W ...
- 转:Spring Boot应用中的异常处理
引自:https://www.cnblogs.com/yangfanexp/p/7616570.html 楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异 ...
- 【基于不同设备厂商在处理vlan之间通信配置例子】
H3C: Dot1q子接口实现vlan之间的通信 一:根据项目需求搭建好拓扑图如下: 二:配置 HUAWEI: CISCO
- redis之哨兵(Sentinel)
Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能. 而 ...
- haystack+Elasticsearch搜素引擎
搜索引擎原理 通过搜索引擎进行数据查询时,搜索引擎并不是直接在数据库中进行查询,而是搜索引擎会对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据. 我们可以将索引结构数据想象成是字典书籍的索引 ...
- Git----将本地代码推送到远程仓库
1.初始化本地 git init 2.添加文件 -A等于 -. 和-a的集合 git add -A 3.提交 git commit -m 'add' 4.关联到远程库 git remote add o ...
- 源码安装CentOs7下的PHP7
首先安装APACHE环境,直接用yum安装 yum install httpd httpd-devel /etc/httpd/ systemctl start httpd.service #启动apa ...
- class实现Stack
基于class实现一个存储string类型的Stack 头文件: //stack.h #include<vector> #include<string> class Stack ...