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 ...
随机推荐
- 爬虫——Handler处理器 和 自定义Opener
我们之前一直都在使用的urlopen,这是一个特殊的opener(也就是模块帮我们构建好的). 但是基本的urlopen()方法不支持代理.cookie等其他的HTTP/HTTPS高级功能.所以要支持 ...
- Vue 2.0 组件库总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...
- Yaf学习(三)----Yaf类库Library和Model的命名规则
1.Yaf的library和model的文件命名规则和调用 1.1在项目中,往往需要封装一些,如redis,不同的产品需要用不同的库等等等,这就涉及到封装 1.在 Yaf 中,我们可以写一个单例模式的 ...
- re模块(详解正则)
re模块 imort re 1.\w \W print(re.findall('\w','ab 12\+- _*&')) #\w 匹配字母 数字 及下划线 执行结果:['a', 'b', '1 ...
- angularjs post data
//post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置 headers: { 'Content-Type': 'application/x- ...
- C#中Equals和= =(等于号)的比较)(转载)
C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一. 值类型的比较 对于值类型来说 ...
- Github上的1000多本免费电子书重磅来袭!
Github上的1000多本免费电子书重磅来袭! 以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...
- static和final的区别(转载)
Java中static 和final的区别 final定义的变量可以看做一个常量,不能被改变: final定义的方法不能被覆盖: final定义的类不能被继承. final static 就是再加上s ...
- Android PopupWindow 疑难杂症之宽度WRAP_CONTENT
一直以来都觉得 Android 中的 PopupWindow 不好用.主要有以下两点:1.宽度不好控制2.位置不好控制 今天单说第1点. 由于应用有好几种国家的语言,加上各设备宣染效果不完全一样,对p ...
- ES6 export,import报错
问题描述: 现有两个文件: profile.js const firstName = 'Michael'; const lastName = 'Jackson'; const year = 2018; ...