Interviewe

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6689    Accepted Submission(s): 1582

Problem Description
YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there are n people coming for the interview. However, YaoYao is so busy that he has no time to interview them by himself. So he decides to select exact m interviewers for this task.
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?
 
Input
The input consists of multiple cases.
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.
 
Output
For each test case, print only one number indicating the smallest m you can find. If you can’t find any, output -1 instead.
 
Sample Input
11 300
7 100 7 101 100 100 9 100 100 110 110
-1 -1
 
Sample Output
3

Hint

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.

思路:RMQ;
先RMQ处理好区间最大值,首先(sqrt(n))枚举分成多少组,然后O(n)检测,这个时候再考虑每组多少人,我们可以知道枚举多少组的时候,我们把每组(sqrt(n),n)都能包括进去,那后就剩每组[1,sqrt(n)-1]的人这种没处理,然后再[1,sqrt(n)]枚举每组的多少人,然后检验,但这个检验的时候要遵循,最小的原则;比如 12 6
111111111111,是5,然么当每组取两个的时候,只要到第5组就可以了,因为12/5=2,12/6=2;复杂度(n×sqrt(n));
 1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<deque>
7 #include<stack>
8 #include<math.h>
9 using namespace std;
10 typedef long long LL;
11 int ans[200005];
12 void RMQ(int n);
13 int mnsum[200005][22];
14 int mm[200005];
15 int rmq(int x, int y);
16 int check(int n,int k,int s);
17 int main(void)
18 {
19 int n;
20 int k;
21 while(scanf("%d %d",&n,&k),n>0&&k>0)
22 {
23 int i;
24 int sum = 0;
25 int minn = -1;
26 for(i = 1; i <= n; i++)
27 {
28 scanf("%d",&ans[i]);
29 sum += ans[i];
30 }
31 if(sum <= k)printf("-1\n");
32 else
33 {
34 RMQ(n);
35 for(i = 1; i <= sqrt(1.0*n); i++)
36 {
37 int x = n/i;
38 int xx = check(n,x,k);
39 if(xx!=-1)
40 {
41 minn = xx;
42 break;
43 }
44 }
45 if(minn == -1)
46 {
47 int y = n/(sqrt(1.0*n))-1;
48 for(i = y; i >= 1; i--)
49 {
50 int xx = check(n,i,k);
51 if(xx!=-1)
52 {
53 minn = xx;
54 break;
55 }
56 }
57 }
58 printf("%d\n",minn);
59 }
60 }
61 return 0;
62 }
63 void RMQ(int n)
64 {
65 mm[0] = -1;
66 for(int i = 1; i<=n; i++)
67 {
68 mm[i] = ((i&(i-1)) == 0) ? mm[i-1]+1:mm[i-1];
69 mnsum[i][0] = ans[i];
70 }
71 for(int j = 1; j<=mm[n]; j++)
72 for(int i = 1; i+(1<<j)-1<=n; i++)
73 mnsum[i][j] = max(mnsum[i][j-1], mnsum[i+(1<<(j-1))][j-1]);
74 }
75 int rmq(int x, int y)
76 {
77 int k = mm[y-x+1];
78 return max(mnsum[x][k], mnsum[y-(1<<k)+1][k]);
79 }
80 int check(int n,int k,int s)
81 { //if(k==1)printf("1\n");
82 int sum = 0;
83 int i;
84 int cnt = 0;
85 for(i = 1; i+k-1<= n; i+=k)
86 {
87 cnt++;
88 sum += rmq(i,i+k-1);
89 if(sum > s)return cnt;//最小原则;
90 }
91 return -1;
92 }

Interviewe(hdu3486)的更多相关文章

  1. *HDU3486 RMQ+二分

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. HDOJ 3486 Interviewe

    人生中第一次写RMQ....一看就知道 RMQ+2分但是题目文不对题....不知道到底在问什么东西....各种WA,TLE,,RE...后就过了果然无论错成什么样都可以过的,就是 上层的样例 啊  I ...

  3. Interviewe

    Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  4. hdu 3486 Interviewe (RMQ+二分)

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. HDU 3486 Interviewe

    题目大意:给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之.现在让我们找最小的k使得和严格大于m. 题解:二分k,然后求RMQ检验. S ...

  6. hdu3486 ST表区间最值+二分

    还是挺简单的,但是区间处理的时候要注意一下 #include<iostream> #include<cstring> #include<cstdio> #inclu ...

  7. Interviewe HDU - 3486( 暴力rmq)

    面试n个人,可以分任意组数,每组选一个,得分总和严格大于k,问最少分几组 就是暴力嘛...想到就去写吧.. #include <iostream> #include <cstdio& ...

  8. HDU 3486 Interviewe RMQ

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

  9. hdu 3484 Interviewe RMQ+二分

    #include <cstdio> #include <iostream> #include <algorithm> using namespace std; + ...

随机推荐

  1. Hbase(6)【Java Api Phoenix操作Hbase】

    目录 两种方式操作Phoenix 1.Thick Driver 2.Thin Driver 3.注意事项 两种方式操作Phoenix 官网:http://phoenix.apache.org/faq. ...

  2. map/multimap深度探索

    map/multimap同样以rb_tree为底层结构,同样有元素自动排序的特性,排序的依据为key. 我们无法通过迭代器来更改map/multimap的key值,这个并不是因为rb_tree不允许, ...

  3. c学习 - 第五章:选择结构程序设计

    5.2 关系运算符与逻辑运算符 !(非) ^ 高 算术运算符 | 关系运算符 | &&和 || | 赋值运算符 | 低

  4. Swift alert 倒计时

    let title: String = "您的开奖时间为" let time: String = "2017-10-23 12:23:18" let count ...

  5. zabbix之主动模式和proxy的主动模式

    #:找一台新主机配置上agent,注意版本要和server端保持一样 #:官网地址:https://www.zabbix.com/documentation/4.0/zh/manual/install ...

  6. 【Java 多线程】Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

    Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建 ...

  7. 【Java多线程】CompletionService

    什么是CompletionService? 当我们使用ExecutorService启动多个Callable时,每个Callable返回一个Future,而当我们执行Future的get方法获取结果时 ...

  8. html上传图片的预览功能实现

    表单代码(仅取上传文件部分): <input class="selectImg" style="position:absolute;opacity: 0;width ...

  9. Tomcat简单介绍

    1.目录结构 在conf文件夹中修改了配置之后一定要重启Tomcat

  10. [MySQL实战-Mysql基础篇]-mysql架构

    1.基本组成 下面是mysql的基本架构示意图  图一 图二 我们可以从图上看出,mysql大体分为两个部分,一个是server层,另一个是引擎层. server层中包含了连接器.查询缓存.分析器.优 ...