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 ...
随机推荐
- (五)、python 函数
一.函数 def 函数名(参数): ... 函数体 ... 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 ...
- linux下的shadow文件解释
/etc/shadow //用户密码文件登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 root:$1$202cb962ac59075b964b0 ...
- 富文本编辑器 summernote.js
1.引用js 可在 https://summernote.org/ 官网下载 ,并查看详细的API 引入:summernote.js 和 summernote-zh-CN.js 以及样式文件:su ...
- MySQL必会
SQL语言对大小写不敏感,但一般使用大.1.创建数据库 CREATE DATABASE test; 2.授予权限 CRANT ALL ON test.* to user(s); 3.使用指定数据库 U ...
- js中的逻辑与和逻辑或随笔
逻辑与:&&,都真才真 逻辑或:||,一真都真 逻辑运算两侧不都是布尔值时,会隐式转换为布尔值转换规则:转换为true:非0数字(包含infinity).非空字符串转换为false:0 ...
- hadoop2.5.0 HA高可用配置
hadoop2.5.0 HA配置 1.修改hadoop中的配置文件 进入/usr/local/src/hadoop-2.5.0-cdh5.3.6/etc/hadoop目录,修改hadoop-env.s ...
- unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...
- 抽象类实验:SIM卡抽象
抽象SIM: package sim_package; public abstract class SIM { public abstract String giveNumber(); public ...
- POJ1659 可图性判定
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10660 Accepted: 4 ...
- C++远征之封装篇(下)-学习笔记
C++远征之封装篇(下) c++封装概述 下半篇依然围绕类 & 对象进行展开 将原本学过的简单元素融合成复杂的新知识点. 对象 + 数据成员 = 对象成员(对象作为数据成员) 对象 + 数组 ...