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 ...
随机推荐
- Firewalld共享上网及本地yum仓库搭建
1.firewalld共享上网 1.服务端操作(有外网的服务器) 1.开启防火墙并加入开机自启动 [root@zeq ~]# systemctl start firewalld [root@zeq ~ ...
- connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)
nginx + php做服务,在高并发的时候会出现一些错误 connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporar ...
- python+matplotlib 绘制等高线
python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵 ...
- 新手学习ARM,对片内ram、SDRAM、NOR FLASH和NAND FLASH启动这几个概念的理解
片内的ram用来存储启动代码,在2440初始化sdram之前,代码就在片内ram中运行.片内ram装载的是norflash中的内容,即u-boot. uboot放在norflash里,nandflas ...
- react-router 4.0中跳转失灵
在https://github.com/ReactTraining/history文档中,跳转是 用这种方法,但是,用了之后就存在这么一个问题,网址换了但是页面并没有刷新. 查了资料后,history ...
- 牛客暑假多校第六场I-Team Rocket
一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...
- python基础之socket套接字基础part2
基于UDP的socket 面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端 1 #客户端 2 import socket 3 ip_port ...
- 用 Qt 控制 Nikon 显微镜的电动物镜转盘
用 Qt 控制 Nikon 显微镜的电动物镜转盘 最近的一个项目,用到了一台 Nikon 的金相显微镜,并且配了个电动的物镜转盘.为了控制这个电动物镜转盘,我折腾了差不多有4-5天.中间遇到了各种问题 ...
- C++各种类型的简单排序大汇总~
啊,排序的技能点也太多了吧!!!LITTLESUN快要**在排序的技能场了啊!(划掉)经历了两天48小时2880分钟172800秒的艰苦奋斗,终于终于终于学的差不多了!明天就可以去打排序的小怪喽!(撒 ...
- ORB-SLAM 代码笔记(三)tracking原理
ORB视觉里程计主体在tracking线程中